單主KEEPALIVED+LVS+LAMP+NFS+Msql讀寫分離

image.png

防止混淆可以根據功能修改主機名

配置客戶端

vi /etc/sysconfig/network-scripts/ifcfg-eth0

NAME=th0
DEVICE=eth0
ONBOOT=yes
NETBOOT=yes
BOOTPROTO=none
IPADDR=172.16.12.6
TYPE=Ethernet
GATEWAY=172.16.12.7
DNS1=192.168.12.8
PREFIX=16

路由器配置

1、ip配置

橋接:172.16.12.7
NAT:192.168.12.7

2、開啓ip_forward轉發

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p    #生效配置

配置PowerDNS

官網    https://www.powerdns.com

1、IP配置

192.168.12.8  
gw:192.168.12.7

2、安裝軟件包,基於epel

yum install -y pdns pdns-backend-mysql -y

3、安裝mariadb,直接裝在本機了,不創建在主從上面了

yum install mariadb-server -y
systemctl start mariadb

4、準備PowerDNS使用的數據庫

CREATE DATABASE powerdns;
GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY '123456';
USE powerdns

創建powerdns數據庫中的表,參看下面文檔實現,直接複製粘貼到mariadb中

https://doc.powerdns.com/md/authoritative/backend-generic-mysql/

image.png

5、配置PowerDNS使用mariadb作爲後臺數據存儲

vim /etc/pdns/pdns.conf

launch=gmysql   在原有基礎上修改,下面的是新添加的
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=123456

6、啓動服務

systemctl start pdns
systemctl enable pdns

7、安裝httpd和php相關包

yum -y install httpd php php-devel php-gd php-mcrypt php-imap \
php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-mbstring  \
php-mcrypt  mcrypt php-mhash gettext
systemctl start httpd
systemctl enable httpd

8、安裝PowerDNS的web界面

cd /var/www/html
wget http://downloads.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz
tar xf poweradmin-2.1.7.tgz
mv poweradmin-2.1.7 poweradmin
setfacl -Rm u:apache:rwx poweradmin

在本地瀏覽器輸入http://192.168.12.8/poweradmin/

第二步

image.png

第三步

image.png

第四步

image.png

第五步

按照提示在數據庫中授權

image.png

第六步

image.png

vi /var/www/html/poweradmin/inc/config.inc.php 將自己頁面中的內容粘貼過來

第七步

image.png

安裝後刪除

rm -rf /var/www/html/poweradmin/install/

登錄http://192.168.12.8/poweradmin/index.php

9、添加主域


image.png

10、添加解析記錄,結果如下

image.png

配置半同步複製

1、配置ip

192.168.12.15
192.168.12.16
192.168.12.17

2、安裝數據庫

yum install mariadb-server

主服務器: 192.168.12.15

(1) vi /etc/my.cnf  添加2行

[mysqld]
server-id=15
log-bin
systemctl start mariadb   啓動服務

(2)創建賬號用於複製

MariaDB [(none)]> grant replication slave on *.* to repluser@'%' identified by '123456';

從服務器1 :192.168.12.16

(1)vi /etc/my.cnf

server-id=16
read-only    #必須加,要根據此項判斷服務器屬於讀組還是寫組的
systemctl start mariadb   啓動服務

(2)連接到主服務器

MariaDB [(none)]> CHANGE MASTER TO
MASTER_HOST='192.168.12.15',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245;

(3)啓動slave,並查看狀態

MariaDB [(none)]> start slave;

image.png

從服務器2 :192.168.12.17

(1) vi /etc/my.cnf  添加2行

[mysqld]
server-id=15
log-bin

(2)(3)和上面一樣

測試下主從工作是否正常,在主服務器創建數據庫

image.png

image.png

安裝半同步插件

主服務器: 192.168.12.15

MariaDB [(none)]>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';  #安裝主節點的插件
MariaDB [(none)]>SET GLOBAL rpl_semi_sync_master_enabled=1;   #啓用
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout = 10000;  #10000ms不同步,主服務器直接回應客戶端,默認10000
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';      #查看主節點狀態

從服務器 :配置一樣

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';   #安裝從節點插件
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;    #啓用
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%'; 
MariaDB [(none)]> stop slave;  #從節點配置過需要重啓線程才生效
MariaDB [(none)]> start slave;  #啓動後在主服務器狀態變量中可以看到一個從節點
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';   #查看狀態變量

image.png

實現讀寫分離

IP 192.168.12.14

1、安裝ProxySQL

yum install https://github.com/sysown/proxysql/releases/download/v1.4.15/proxysql-1.4.15-1-centos7.x86_64.rpm

2、安裝mariadb客戶端用來登錄ProxySQL

yum install mariadb

3、啓動proxysql

啓動後會監聽兩個默認端口

6032:ProxySQL的管理端口

6033:ProxySQL對外提供服務的端口

service proxysql start

4、使用mysql客戶端連接到ProxySQL的管理接口6032,默認管理員用戶和密碼都是admin:

mysql -uadmin -padmin -P6032 -h127.0.0.1

5、查看錶結構

MySQL [(none)]> show tables;
MySQL [(none)]> select * from sqlite_master where name='mysql_servers'\G

6、添加主從節點到分組

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.12.15',3306); 
MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.12.16',3306);
MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.12.17',3306);
MySQL [(none)]> load mysql variables to runtime;     #加載到RUNTIME,
MySQL [(none)]> save mysql variables to disk;          #保存到disk
 10組爲默認爲寫組,全部添加到寫組,monitor賬號會通過read-only自動判斷

7、在master(192.168.12.15)上創建賬號,讓proxysql能夠監控

MariaDB [(none)]> grant replication client on *.* to monitor@'192.168.12.%' identified by '123456';

8、在ProxySQL上配置監控賬號


MySQL [(none)]> set mysql-monitor_username='monitor';
MySQL [(none)]> set mysql-monitor_password='123456';
MySQL [(none)]> load mysql variables to runtime;
MySQL [(none)]> save mysql variables to disk;
MySQL [(none)]> select * from mysql_server_connect_log;    #查看是否連接成功


image.png

9、需要修改的是main庫中的mysql_replication_hostgroups表,該表有3個字段:writer_hostgroup寫組,reader_hostgroup讀組,comment備註, 指定寫組的id爲10,讀組的id爲20

 MySQL> insert into mysql_replication_hostgroups values(10,20,"test");
MySQL> load mysql servers to runtime;
MySQL> save mysql servers to disk;

Monitor模塊監控後端的read_only值,按照read_only的值將節點自動移動到讀/寫組

MySQL> select hostgroup_id,hostname,port,status,weight from mysql_servers;
MySQL [(none)]> select hostgroup_id,hostname,port,status,weight from mysql_servers;

image.png

10、在master節點上創建訪問用戶

MySQL> grant all on *.* to sqluser@'192.168.12.%' identified by '123456';

MariaDB [(none)]> create database wordpress;    創建wordpress數據庫
MariaDB [(none)]> grant all on wordpress.* to wpuser@'%' identified by '123456';

11、在ProxySQL配置,將用戶sqluser添加到mysql_users表中, default_hostgroup默認組設

置爲寫組10,當讀寫分離的路由規則不符合時,會訪問默認組的數據庫

MySQL> insert into mysql_users(username,password,default_hostgroup) values('sqluser','123456',10);
MySQL> insert into mysql_users(username,password,default_hostgroup) values('wpuser','123456',10);
MySQL> load mysql users to runtime;
MySQL> save mysql users to disk;

12、沒有添加讀寫路由規則測試下

使用sqluser用戶測試是否能路由到默認的10寫組 實現讀、寫數據,由於沒有添加路由規則讀寫都發往10組,也就是server-id是15的

mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'select @@server_id'

image.png

mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'create database testdb'
mysql -usqluser -p123456 testdb -P6033 -h127.0.0.1 -e 'create table t(id int)'

13、在proxysql上配置路由規則,將select語句分離到20的讀組,select語句中有一個特殊語句SELECT...FOR UPDATE它會申請寫鎖,應路由到10的寫組

MySQL [(none)]> insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)VALUES  (1,1,'^SELECT.*FORUPDATE$',10,1),(2,1,'^SELECT',20,1);
MySQL> load mysql query rules to runtime;
MySQL> save mysql query rules to disk;

注意:因ProxySQL根據rule_id順序進行規則匹配,select ... for update規則的

14、測試是否實現讀寫分離,添加過路由查詢語句發往2個從節點

mysql -usqluser -p123456 -P6033 -h127.0.0.1 -e 'select @@server_id'

image.png

配置NFS

IP: 192.168.12.13

1、安裝軟件包

yum install nfs-utils

2、配置

mkdir -p /data/wordpress
vi /etc/exports
/data/wordpress *(rw,all_squash,anonuid=48,anongid=48)
exportfs -r   生效配置
systemctl start nfs-server  #啓動服務

3、創建賬號

useradd -r -u 48 -s /sbin/nologin apache

4、上傳到wordpress程序到/data目錄下解壓

chown -R apache.apache /data/wordpress

配置WEB服務

IP:192.168.12.11

IPADDR=192.168.12.12
DNS1=192.168.12.8

IP:192.168.12.12

IPADDR=192.168.12.12
DNS1=192.168.12.8

1、安裝php+apache

yum -y install php httpd php-mysql php-mbstring

2、修改配置文件

vi /etc/httpd/conf.d/test.conf

<virtualhost *:80>
    documentroot /data/wordpress
    servername www.heng.com
    <directory /data/wordpress>                                                               
        require all granted
    </directory>
</virtualhost>

3、掛載nfs到本機

yum install nfs-utils -y  安裝nfs軟件
mkdir /data/wordpress -p
echo '192.168.12.13:/data/wordpress /data/wordpress nfs defaults 0 0' >> /etc/fstab
mount -a

另一臺web服務器的配置一樣,按照1、2、3步驟

4、安裝wordpress,注意數據庫地址

在瀏覽器輸入192.168.12.11開始安裝

image.png

5、測試在一臺web服務器安裝之後,無論在哪一臺web服務器上都可以訪問

image.png


配置單主KEEPALIVED+LVS

ka1:192.168.12.9

          gw:192.168.12.7

ka2:192.168.12.10

          gw:192.168.12.7

1、安裝keepalived

yum install keepalived

2、修改配置文件

vi /etc/keepalived/keepalived.conf

192.168.12.9

global_defs {
   notification_email {
     admin@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka1
   #vrrp_mcast_group4 224.100.100.100
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 66
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.12.100/24 dev eth0 label eth0:1 
    }
}

virtual_server 192.168.12.100 80 {                                                            
    delay_loop 6
    lb_algo rr 
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80

    real_server 192.168.12.11 80 {
        weight 1
        HTTP_GET {
            url { 
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.12.12 80 {
        weight 1
        HTTP_GET {
            url { 
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

192.168.12.10

vi /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id ka2
   #vrrp_mcast_group4 224.100.100.100
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 66
    priority 88
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.12.100/24 dev eth0 label eth0:1
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 192.168.12.100 80 {
delay_loop 6
    lb_algo rr 
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80
 real_server 192.168.12.11 80 {
        weight 1
        HTTP_GET {
            url { 
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.12.12 80 {
        weight 1
        HTTP_GET {
            url { 
              path /
              status_code 200
            }
            connect_timeout 3
nb_get_retry 3
            delay_before_retry 3
        }
    }
}

3、兩臺web服務器都要執行

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ip a a 192.168.12.100 dev lo:1

4、啓動keepalived

systemctl start keepalived

image.png

修改本地hosts文件,開始測試

image.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章