85: MySQL集群 、 负载均衡及高可用 、 总结和答疑

Top

NSD PROJECT3 DAY02

1 案例1:初始化环境

1.1 问题

本案例要求在华为云上购买云主机,并部署Mysql服务器,要求如下:

  • 购买华为云服务器,更新ecs-proxy上环境配置
  • 给三台设备部署安装Mysql服务
  • 初始化三台Mysql数据库

1.2 方案

准备如表-1所示的实验环境,配置主机名称、IP地址。

表-1 主机列表

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一、购买华为云服务器,更新ecs-proxy主机环境配置

1)、购买华为云服务器

基础配置:无
网络配置:手动分配IP地址 192.168.1.41
高级配置:云服务器名称 mha
确认配置:4台

2)在ecs-proxy上更新/etc/hosts配置文件

[root@ecs-proxy DAY01]# cat >> /etc/hosts < 
   

3)、在ecs-proxy上更新/root/ansible/hosts配置文件

[root@ecs-proxy DAY01]# cat >> /root/ansible/hosts < 
   

步骤二、给四台设备部署安装Mysql服务

1)分发软件包

[root@ecs-proxy ~]# cd /root/ansible/
[root@ecs-proxy ansible]# ansible db -m copy -a "src=/root/project3/DAY02/mysql-5.7.17.tar dest=/root"
[root@ecs-proxy ansible]# ansible db -m copy -a "src=/root/project3/DAY02/mha-soft-student.zip dest=/root"

2)安装软件包

[root@ecs-proxy ansible]# ansible db -m shell -a 'unzip /root/mha-soft-student.zip'
[root@ecs-proxy ansible]# ansible db -m shell -a 'yum -y install /root/mha-soft-student/perl*'
[root@ecs-proxy ansible]# ansible db -m shell -a 'yum -y install perl-JSON perl-Data-Dumper libaio'
[root@ecs-proxy ansible]# ansible db -m shell -a 'tar -xf /root/mysql-5.7.17.tar'
[root@ecs-proxy ansible]# ansible db -m shell -a 'rpm -Uvh /root/mysql-comm*'
[root@ecs-proxy ansible]# ansible db -m service -a 'name=mysqld state=restarted enabled=yes'

3)、四台数据库之间免密登录

[root@ecs-proxy ansible]# ansible db -m copy -a 'src=/root/.ssh/id_rsa dest=/root/.ssh mode=0600'

步骤三、初始化四台Mysql数据库

配置服务器mha-0001

[root@mha-0001 ~]# grep ' temporary password' /var/log/mysqld.log 
2020-06-09T01:28:17.799317Z 1 [Note] A temporary password is generated for root@localhost: k)sejg42kZzP
[root@mha-0001 ~]# mysql -uroot -p'k)sejg42kZzP'
mysql> alter user root@'localhost' identified by '123qqq...A';
mysql> flush privileges;

配置服务器mha-0002

[root@mha-0002 ~]# grep ' temporary password' /var/log/mysqld.log 
2020-06-09T01:34:13.856800Z 1 [Note] A temporary password is generated for root@localhost: _dkRhq),4sAA
[root@mha-0002 ~]# mysql -uroot -p'_dkRhq),4sAA'
mysql> alter user root@'localhost' identified by '123qqq...A';
mysql> flush privileges;

配置服务器mha-0003

[root@mha-0003 ~]# grep ' temporary password' /var/log/mysqld.log
2020-06-09T01:34:13.834391Z 1 [Note] A temporary password is generated for root@localhost: un!CopYfJ2>k
[root@mha-0003 ~]# mysql -uroot -p'un!CopYfJ2>k'
mysql> alter user root@'localhost' identified by '123qqq...A';
mysql> flush privileges;

配置服务器mha-0004

[root@mha-0004 ~]# grep ' temporary password' /var/log/mysqld.log
2020-06-09T01:34:13.834391Z 1 [Note] A temporary password is generated for root@localhost: z_zRdqzff7 alter user root@'localhost' identified by '123qqq...A';
mysql> flush privileges;

2 案例2、配置一主多从结构

2.1 问题

本案例要求构建一主多从结构

  • 配置mha-0001数据库服务器为master
  • 配置mha-0002、mha-0003、mha-0004数据库服务器为slave

2.2 方案

Mysql主从复制集群功能使得Mysql数据库支持大规模高并发读写成为可能,同时有效地保护了护理服务器宕机场景的数据备份。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一、配置主服务器mha-0001

1)、修改配置文件。启用binlog日志,并重启服务。

[root@mha-0001 ~]# sed -n '4,7p' /etc/my.cnf
[mysqld]
server_id=41 #server_id用来标识数据库
log-bin=master41 #启用bin-log日志,并指定日志名称

[root@mha-0001 ~]# systemctl restart mysqld
[root@mha-0001 ~]# netstat -antput | grep mysqld
tcp6 0 0 :::3306 :: LISTEN 3347/mysqld

2)、查看主服务正在使用的日志信息。


查看主服务器状态,记录下当前的日志文件名、偏移的位置(下面SLAVE发起复制时需要用到):


[root@mha-0001 ~]# mysql -uroot -p’123qqq…A’ -e “show master status;”
±----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±----------------±---------±-------------±-----------------±------------------+
| master41.000001 | 154 | | | |
±----------------±---------±-------------±-----------------±------------------+

3)用户授权


[root@mha-0001 ~]# mysql -uroot -p’123qqq…A’ -e “grant replication slave on . to reuser@‘192.168.1.%’ identified by ‘123qqq…A’;”
[root@mha-0001 ~]# mysql -uroot -p’123qqq…A’ -e “show grants for reuser@‘192.168.1.%’;”
±---------------------------------------------------------+
| Grants for [email protected].% |
±---------------------------------------------------------+
| GRANT REPLICATION SLAVE ON . TO ‘reuser’@‘192.168.1.%’ |
±---------------------------------------------------------+

步骤二、配置从服务器mha-0002

1)、修改配置文件,并重启服务。

[root@mha-0002 ~]# sed -i '4a server_id=42' /etc/my.cnf
[root@mha-0002 ~]# systemctl restart mysqld
[root@mha-0002 ~]# netstat -antput | grep mysqld
tcp6 0 0 :::3306 :::* LISTEN 3356/mysqld 

2)、管理员登录指定主库信息

通过change master语句指定master服务器的IP地址、同步用户名/密码、起始日志文件、偏移位置(参考master上的状态输出)

[root@mha-0002 ~]# mysql -uroot -p'123qqq...A' -e 'change master to master_host="192.168.1.41",master_user="reuser",master_password="123qqq...A",master_log_file="master41.000001",master_log_pos=154;'
[root@mha-0002 ~]# mysql -uroot -p'123qqq...A' -e 'start slave;'  
#启动slave进程
[root@mha-0002 ~]# mysql -uroot -p'123qqq...A' -e 'show slave status\G;' 
#查看进程状态信息
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.41
Master_User: reuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master41.000001
Read_Master_Log_Pos: 449
Relay_Log_File: mha-0002-relay-bin.000002
Relay_Log_Pos: 614
Relay_Master_Log_File: master41.000001
Slave_IO_Running: Yes #IO线程YES
Slave_SQL_Running: Yes #SQL线程YES
.......

步骤三、配置从服务器mha-0003

1)、修改配置文件,并重启服务。

[root@mha-0003 ~]# sed -i '4a server_id=43' /etc/my.cnf
[root@mha-0003 ~]# systemctl restart mysqld
[root@mha-0003 ~]# netstat -antput | grep mysqld
tcp6 0 0 :::3306 :::* LISTEN 2895/mysqld

2)、管理员登录指定主库信息

[root@mha-0003 ~]# mysql -uroot -p'123qqq...A' -e 'change master to master_host="192.168.1.41",master_user="reuser",master_password="123qqq...A",master_log_file="master41.000001",master_log_pos=154;'
[root@mha-0003 ~]# mysql -uroot -p'123qqq...A' -e 'start slave;' 
#启动slave进程
[root@mha-0003 ~]# mysql -uroot -p'123qqq...A' -e 'show slave status\G;' 
#查看进程状态信息
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.41
Master_User: reuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master41.000001
Read_Master_Log_Pos: 449
Relay_Log_File: mha-0003-relay-bin.000002
Relay_Log_Pos: 614
Relay_Master_Log_File: master41.000001
Slave_IO_Running: Yes #IO线程YES
Slave_SQL_Running: Yes #SQL线程YES
......

步骤四、配置从服务器mha-0004

1)、修改配置文件,并重启服务。

[root@mha-0004 ~]# sed -i '4a server_id=44' /etc/my.cnf
[root@mha-0004 ~]# systemctl restart mysqld
[root@mha-0004 ~]# netstat -antput | grep mysqld
tcp6 0 0 :::3306 :::* LISTEN 2494/mysqld

2)、管理员登录指定主库信息

[root@mha-0004 ~]# mysql -uroot -p'123qqq...A' -e 'change master to master_host="192.168.1.41",master_user="reuser",master_password="123qqq...A",master_log_file="master41.000001",master_log_pos=154;'
[root@mha-0004 ~]# mysql -uroot -p'123qqq...A' -e 'start slave;' 
#启动slave进程
[root@mha-0003 ~]# mysql -uroot -p'123qqq...A' -e 'show slave status\G;' 
#查看进程状态信息
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.41
Master_User: reuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master41.000001
Read_Master_Log_Pos: 449
Relay_Log_File: mha-0004-relay-bin.000002
Relay_Log_Pos: 614
Relay_Master_Log_File: master41.000001
Slave_IO_Running: Yes #IO线程YES
Slave_SQL_Running: Yes #SQL线程YES
......

3 案例3、部署MHA集群

3.1 问题

本案例要求部署MHA集群

  • 配置管理节点
  • 配置数据节点
  • 故障恢复

3.2 步骤

实现此案例需要按照如下步骤进行。

步骤一、配置管理节点

1)、购买华为云服务器

基础配置:无
网络配置:手动分配IP地址 192.168.1.45
高级配置:云服务器名称 mgm
确认配置:1台

2)、安装依赖包

[root@mgm ~]# scp [email protected]:/root/project3/DAY02/mha-soft-student.zip /root
[root@mgm ~]# unzip /root/mha-soft-student.zip
[root@mgm ~]# yum -y install /root/mha-soft-student/perl-*.rpm
[root@mgm ~]# yum -y install perl-DBD-MySQL perl-DBI perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan 
[root@mgm ~]# rpm -ivh /root/mha-soft-student/mha4mysql-node-0.56-0.el6.noarch.rpm

[root@mgm ~]# tar -xf /root/mha-soft-student/mha4mysql-manager-0.56.tar.gz -C /root/mha-soft-student
[root@mgm mha-soft-student]# cd /root/mha-soft-student/mha4mysql-manager-0.56/
[root@mgm mha4mysql-manager-0.56]# perl Makefile.PL
[root@mgm mha4mysql-manager-0.56]# make && make install

3)、登陆其他主机免密登陆

[root@ecs-proxy ansible]# ansible mgm -m copy -a 'src=/root/.ssh/id_rsa dest=/root/.ssh mode=0600'

4)、编写管理主机mgm主配置文件

[root@mgm mha4mysql-manager-0.56]# mkdir /etc/mha #创建工作目录
[root@mgm mha4mysql-manager-0.56]# cd /etc/mha 

[root@mgm mha]# cp /root/mha-soft-student/mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/mha/ #拷贝模板文件

【注意:不要将注释信息写入该配置文件,不然会报错。】
[root@mgm mha]# cat /etc/mha/app1.cnf
[server default] #管理服务默认配置
manager_workdir=/etc/mha #工作目录
manager_log=/etc/mha/manager.log #日志文件
master_ip_failover_script=/etc/mha/master_ip_failover #故障切换脚本
ssh_user=root #ssh的登录用户
ssh_port=22 #ssh服务端口
repl_user=reuser #主服务器数据同步授权用户
repl_password=123qqq…A
user=monuser #监控用户
password=123qqq…A

[server1] #指定第1台数据库服务器
hostname=192.168.1.41 #服务器ip地址
candidate_master=1

[server2]
hostname=192.168.1.42
candidate_master=1 #设置为候选master,如果设置参数后,发生主从切换后会将此从库提升为主。

[server3]
hostname=192.168.1.43
no_master=1
[server4]
hostname=192.168.1.44
no_master=1

4)创建故障切换脚本


[root@mgm ~]# cp /root/mha-soft-student/master_ip_failover /etc/mha
[root@mgm mha]# vim +35 /etc/mha/master_ip_failover
my $vip = ‘192.168.1.40/24’; # Virtual IP //改为实验中需要的VIP
my $key = “1”;
my s s h s t a r t v i p = " / s b i n / i f c o n f i g e t h 0 : ssh_start_vip = "/sbin/ifconfig eth0: sshstartvip="/sbin/ifconfigeth0:key $vip";
my s s h s t o p v i p = " / s b i n / i f c o n f i g e t h 0 : ssh_stop_vip = "/sbin/ifconfig eth0: sshstopvip="/sbin/ifconfigeth0:key down";
[root@mgm mha]# chmod +x /etc/mha/master_ip_failover #给脚本添加执行权限

5)、在mha-0001上创建监控用户。


在修改管理节点的配置文件时,有一个管理用户需要创建。可在MHA-0001上执行,会同步到其他节点上。


[root@mha-0001 ~]# mysql -uroot -p"123qqq…A" -e ‘grant all on . to monuser@"%" identified by “123qqq…A”;’

在mha-0002节点上查看,是否同步成功。
[root@mha-0002 ~]# mysql -uroot -p"123qqq…A" -e ‘show grants for monuser’
±---------------------------------------------+
| Grants for monuser@% |
±---------------------------------------------+
| GRANT ALL PRIVILEGES ON . TO ‘monuser’@’%’ |
±---------------------------------------------+

6)、给mha-0001配置VIP地址。


[root@mha-0001 ~]# ifconfig eth0:1 192.168.1.40/24
[root@mha-0001 ~]# ifconfig eth0:1
eth0:1: flags=4163 mtu 1500
inet 192.168.1.40 netmask 255.255.255.0 broadcast 192.168.1.255
ether fa:16:3e:94:60:58 txqueuelen 1000 (Ethernet)

步骤二、配置被管理节点


1)、在mha-0001~mha-0003,安装mha4mysql-node软件包。(mgm在配置管理节点时已安装过。)


[root@ecs-proxy ansible]# ansible db -m shell -a ‘yum -y install perl-DBD-MySQL perl-DBI’
[root@ecs-proxy ansible]# ansible db -m shell -a ‘rpm -ivh /root/mha-soft-student/mha4mysql-node*’

2)、在mha-0002开启binlog日志。


(日后有可能成为主,所以开启binlog日志。)


mha-0002
[root@mha-0002 ~]# sed -i ‘4a log-bin=master42’ /etc/my.cnf

3)、在mha-0001和mha-0002上设置禁止自动删除本机的中继日志。


(在默认情况下,从服务器上的中继日志会在SQL线程执行完后被自动删除,只会有最新的两个中继日志文件存在。但是在MHA中,这些中继日志在恢复其他从服务器时可能会用到,因此需要禁用中继日志的自动清除。)


mha-0001
[root@mha-0001 ~]#sed -i ‘4a relay_log_purge=0’ /etc/my.cnf

mha-0002
[root@mha-0002 ~]#sed -i ‘4a relay_log_purge=0’ /etc/my.cnf

4)、在mha-0001、mha-0002上启动半同步复制。


mha-0001


[root@mha-0001 ~]# cat >> /etc/my.cnf <
plugin-load = “rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so”
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
EOF
[root@mha-0001 ~]# systemctl restart mysqld

mha-0002


[root@mha-0002 ~]# cat >> /etc/my.cnf <
plugin-load = “rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so”
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
EOF
[root@mha-0002 ~]# systemctl restart mysqld

5)、在mgm上执行验证工作。


验证ssh(如果没有问题都显示OK,如果有ERR,根据错误,去重新建立免密连接。)


[root@mgm mha]# masterha_check_ssh --conf=/etc/mha/app1.cnf

Sat Jun 20 18:31:21 2020 - [info] All SSH connection tests passed successfully.

验证mysql主从同步配置


[root@mgm mha]# masterha_check_repl --conf=/etc/mha/app1.cnf

MySQL Replication Health is OK.

6)、启动管理服务


查看目前服务状态


–remove_dead_master_conf 该参数代表发生主从切换后,老主库的IP地址将会从配置文件中移除。


–ignore_last_failover 在缺省情况下,如果MHA检测到连续宕机,且两次宕机时间间隔不足8小时的话,则不进行Failover。该参数代表忽略上次进行切换的时间。


[root@mgm ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING).

[root@mgm ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover

另开一个终端,去查看mgm的服务状态。


[root@mgm ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4112) is running(0:PING_OK), master:192.168.1.41

7)、测试高可用集群配置


在mha-0001上添加创建库并且添加测试用户。


[root@mha-0001 ~]# mysql -uroot -p"123qqq…A" -e “create database testdb;”
[root@mha-0001 ~]# mysql -uroot -p"123qqq…A" -e “create table testdb.t1(id int);”
[root@mha-0001 ~]# mysql -uroot -p"123qqq…A" -e “insert into testdb.t1 values(11);”
[root@mha-0001 ~]# mysql -uroot -p"123qqq…A" -e ‘select * from testdb.t1;’
±-----+
| id |
±-----+
| 11 |
±-----+

8)将创建的VIP 192.168.1.40,绑定mha-0001、mha-0002数据库服务器。


点击【控制台】->【服务列表】->【虚拟私有云VPC】,如图-1所示。




图-1



点击【子网】—>【名称】创建的子网名称,如图-2所示。




图-2



【IP地址管理】->【申请虚拟IP地址】,如图-3所示。




图-3



申请虚拟IP地址192.168.1.40,如图-4所示。




图-4



依次绑定两台数据库服务器(每次只能绑定一台),如图-5所示。




图-5



9)默认root用户只能从本地连接。更改配置,允许远程连接。


[root@mha-0001 ~]# mysql -uroot -p"123qqq…A" -e “update mysql.user set host=’%’ where user=‘root’;”
[root@mha-0001 ~]# mysql -uroot -p"123qqq…A" -e ‘flush privileges;’ #刷新权限信息

10)在esc-proxy上安装mariadb数据库客户端,连接VIP,测试是否能写入数据。


[root@ecs-proxy ~]# yum -y install mariadb
[root@ecs-proxy ~]# mysql -uroot -h 192.168.1.40 -p’123qqq…A’ -e “insert into testdb.t1 values(22)”
[root@ecs-proxy ~]# mysql -uroot -h 192.168.1.40 -p’123qqq…A’ -e “select * from testdb.t1”
±-----+
| id |
±-----+
| 11 |
| 22 |
±-----+

步骤三、故障恢复


[root@mha-0001 ~]# systemctl  stop mysqld

mha-0001数据库故障后,MHA快速完成故障切换,最大限度保障数据的一致性。


/etc/mha/app1.cnf 中关于192.168.1.41的配置会清除。


mha-0002成为了新的主,并且VIP地址192.168.1.40也会转移到mha-0002上。


其他从数据库会重新指定主数据库为mha-0002。(重新指定为故障脚本自动执行)


查看从服务器指定的新主信息
[root@mha-0004 ~]# mysql -uroot -p123qqq…A -e “show slave status\G;”
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.42
Master_User: reuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master42.000001
Read_Master_Log_Pos: 1076
Relay_Log_File: mha-0004-relay-bin.000002
[root@ecs-proxy ansible]# mysql -uroot -h 192.168.1.40 -p’123qqq…A’ -e “insert into testdb.t1 values(33)”
[root@ecs-proxy ansible]# mysql -uroot -h 192.168.1.40 -p’123qqq…A’ -e “insert into testdb.t1 values(44)”
[root@ecs-proxy ansible]# mysql -uroot -h 192.168.1.40 -p’123qqq…A’ -e “select * from testdb.t1”
±-----+
| id |
±-----+
| 11 |
| 22 |
| 33 |
| 44 |
±-----+

[root@mha-0001 ~]# systemctl restart mysqld
[root@mha-0001 ~]# mysql -uroot -p’123qqq…A’ -e “select * from testdb.t1”
±-----+
| id |
±-----+
| 11 |
| 22 |
±-----+

按照我们的配置,mha-0001挂掉之后,mha-0002数据库服务器会成为集群新的主。故障恢复脚本将其他从数据库服务器的主指向mha-0002(新主)。需要指定主服务器信息,这些信息从manager.log文件中获取。mha-0002的数据库服务器binlog日志文件名叫master42,所以检索该关键词的相关内容。


[root@mgm ~]# grep  master42  /etc/mha/manager.log
Sat Aug 29 11:11:41 2020 - [info] master42.000001:154
Sat Aug 29 11:11:41 2020 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST=‘192.168.1.42’, MASTER_PORT=3306, MASTER_LOG_FILE=‘master42.000001’, MASTER_LOG_POS=154, MASTER_USER=‘reuser’, MASTER_PASSWORD=‘xxx’;

根据日志的输出内容,指定主服务器信息。
[root@mha-0001 ~]# mysql -uroot -p123qqq…A
mysql> CHANGE MASTER TO MASTER_HOST=‘192.168.1.42’, MASTER_PORT=3306, MASTER_LOG_FILE=‘master42.000001’, MASTER_LOG_POS=154, MASTER_USER=‘reuser’, MASTER_PASSWORD=‘123qqq…A’;
[root@mha-0001 ~]# mysql -uroot -p’123qqq…A’ -e ‘start slave;’
[root@mha-0001 ~]# mysql -uroot -p’123qqq…A’ -e ‘show slave status\G;’
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.42
Master_User: reuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master42.000001
Read_Master_Log_Pos: 656
Relay_Log_File: mha-0001-relay-bin.000002
Relay_Log_Pos: 821
Relay_Master_Log_File: master42.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

[root@mha-0001 ~]# mysql -uroot -p’123qqq…A’ -e “select * from testdb.t1”
±-----+
| id |
±-----+
| 11 |
| 22 |
| 33 |
| 44 |
±-----+



4 案例4、Mycat实现Mysql数据库读写分离


4.1 问题


本案例要求在搭建读写分离。收到SQL写请求时,交给主服务器处理,收到SQL读请求时,交给从服务器处理。



  • 在mycat-0001和mycat0002上部署Mycat
  • 更改Mycat配置文件
  • 测试配置
  • 4.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一、在mycat-0001和mycat0002上部署Mycat服务

    1)、购买华为云服务器

    基础配置:无
    网络配置:手动分配IP地址 192.168.1.46
    高级配置:云服务器名称 mycat
    确认配置:2台
    

    2)、部署运行环境,安装Mycat软件包

    [root@ecs-proxy ~]# cd /root/ansible/
    [root@ecs-proxy ansible]# ansible mycat -m shell -a 'yum -y install java-1.8.0-openjdk'
    [root@ecs-proxy ansible]# ansible mycat -m copy -a 'src=/root/project3/DAY02/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz dest=/root'
    [root@ecs-proxy ansible]# ansible mycat -m shell -a 'tar -xf /root/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz'
    [root@ecs-proxy ansible]# ansible mycat -m shell -a 'mv /root/mycat /usr/local'
    

    步骤二、修改mycat-0001的Mycat配置文件,启动并测试。

    server.xml设置连接帐号及逻辑库。MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!

    schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!

    1)、修改server.xml配置文件

    定义连接Mycat的用户

    [root@mycat-0001 ~]# sed -n '80,82p' /usr/local/mycat/conf/server.xml
    
    123456
    TESTDB
    

    定义只读权限的Mycat连接用户。

    [root@mycat-0001 ~]# sed -n 95,99p' /usr/local/mycat/conf/server.xml 
    
    123456
    TESTDB
    true
    
    

    2)、修改schema.xml配置文件

    将配置文件做备份

    [root@mycat-0001 ~]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak
    把用不到的配置内容给删除,精简配置文件
    [root@mycat-0001 ~]# sed -i '6,32d' /usr/local/mycat/conf/schema.xml
    [root@mycat-0001 ~]# sed -i '7,15d' /usr/local/mycat/conf/schema.xml
    [root@mycat-0001 ~]# sed -i '16,18d' /usr/local/mycat/conf/schema.xml
    [root@mycat-0001 ~]# sed -i '17,38d' /usr/local/mycat/conf/schema.xml
    

    定义逻辑库表

    定义数据节点

    定义数据节点的物理数据源

    balance指的负载均衡类型,目前的取值有4种:

    balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

    balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡

    balance="2",所有读操作都随机的在writeHost、readhost上分发。

    balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

    WriteType参数设置:

    writeType=“0”, 所有写操作都发送到第一个可用的writeHost上。

    writeType=“1”,所有写操作都随机的发送到writeHost上。

    writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。

    [root@mycat-0001 ~]# cat /usr/local/mycat/conf/schema.xml
    
    
    
    




    writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1” slaveThreshold=“100”>
    select user()







    3)、在目前的主数据库mha-0002上授权用户


    授权一个执行读操作的用户


    [root@mha-0002 ~]# mysql -uroot -p"123qqq…A" -e ‘grant select on . to readuser@"%" identified by “123qqq…A”;’
    [root@mha-0002 ~]# mysql -uroot -p"123qqq…A" -e ‘flush privileges;’ #刷新权限信息

    4)、启动mycat服务,并查看端口状态。


    [root@mycat-0001 ~]# /usr/local/mycat/bin/mycat start
    Starting Mycat-server…
    [root@mycat-0001 ~]# netstat -antpu | grep 8066
    tcp6 0 0 :::8066 :: LISTEN 12742/java

    5)、在ecs-proxy上测试分离结果。


    [root@ecs-proxy ansible]# mysql -uroot -h 192.168.1.46 -P8066 -p’123456’ -e “select @@hostname”
    ±-----------+
    | @@hostname |
    ±-----------+
    | mha-0003 |
    ±-----------+
    [root@ecs-proxy ansible]# mysql -uroot -h 192.168.1.46 -P8066 -p’123456’ -e “select @@hostname”
    ±-----------+
    | @@hostname |
    ±-----------+
    | mha-0004 |
    ±-----------+

    步骤三、修改mycat-0002的Mycat配置文件,启动并测试。


    1)、将mycat-0001上的配置文件拷贝到mycat-0002上


    [root@mycat-0002 ~]# scp [email protected]:/usr/local/mycat/conf/{server,schema}.xml /usr/local/mycat/conf/

    2)、启动mycat服务,并查看端口状态


    [root@mycat-0002~]# /usr/local/mycat/bin/mycat start
    [root@mycat-0002~]# netstat -antpu | grep 8066
    tcp6 0 0 :::8066 :: LISTEN 2211/java

    [root@ecs-proxy ansible]# mysql -uroot -h 192.168.1.46 -P8066 -p’123456’ -e “select @@hostname”
    ±-----------+
    | @@hostname |
    ±-----------+
    | mha-0003 |
    ±-----------+
    [root@ecs-proxy ansible]# mysql -uroot -h 192.168.1.46 -P8066 -p’123456’ -e “select @@hostname”
    ±-----------+
    | @@hostname |
    ±-----------+
    | mha-0004 |
    ±-----------+



    5 案例5、配置HAProxy负载平衡集群


    5.1 问题


    本案例要求部署两台HAProxy负载均衡集群。



    • HAProxy部署在ha-ke-0001、ha-ke-0002两台华为云主机上
  • 客户端访问HAProxy,HAProxy分发请求到后端(mycat-0001、mycat-0002)
  • 开启HAProxy管理页面,及时查看调度器状态
  • 5.2 步骤

    实现此案例需要按照如下步骤进行。

    步骤一、部署HAProxy服务

    1)、购买华为云服务器

    基础配置:无
    网络配置:手动分配IP地址 192.168.1.48
    高级配置:云服务器名称 ha-ke
    确认配置:2台
    

    2)在ha-ke-0001安装haproxy软件

    [root@ha-ke-0001 ~]# yum -y install haproxy 
    

    3)、在ha-ke-0001上修改配置文件。

    [root@ha-ke-0001 ~]# sed -i '60,$d' /etc/haproxy/haproxy.cfg
    [root@ha-ke-0001 ~]# sed -n '60,71p' /etc/haproxy/haproxy.cfg
    listen mysql_3306 *:3308 #监听端口
    mode tcp #haproxy工作方式 ,4层调度。
    balance leastconn #新的连接请求被派发至具有最少连接数目的后端服务器
    server mycat_01 192.168.1.46:8066 check inter 3000 rise 1 maxconn 1000 fall 3
    server mycat_02 192.168.1.47:8066 check inter 3000 rise 1 maxconn 1000 fall 3
    

    listen stats :1080 #监听端口
    stats refresh 30s #统计页面自动刷新时间
    stats uri /stats #统计页面url
    stats realm Haproxy Manager #进入管理界面查看状态信息
    stats auth admin:admin #统计页面用户名和密码设置

    4)、启动服务器并设置开机自启。


    [root@ha-ke-0001 ~]# systemctl restart haproxy
    [root@ha-ke-0001 ~]# systemctl enable haproxy
    [root@ha-ke-0001 ~]# netstat -antpu | grep haproxy
    tcp 0 0 0.0.0.0:1080 0.0.0.0: LISTEN 1399/haproxy
    tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 1399/haproxy
    udp 0 0 0.0.0.0:48951 0.0.0.0:* 1398/haproxy

    5)、在ha-ke-0002上部署HAProxy服务。


    将ha-ke-0001的配置文件拷贝至ha-ke-0002服务器上,启动服务并设置开机自启。


    [root@ha-ke-0002 ~]# yum -y install haproxy
    [root@ha-ke-0002 ~]# scp [email protected]:/etc/haproxy/haproxy.cfg /etc/haproxy/
    [root@ha-ke-0002 ~]# systemctl restart haproxy
    [root@ha-ke-0002 ~]# systemctl enable haproxy
    [root@ha-ke-0002 ~]# netstat -antpu | grep haproxy
    tcp 0 0 0.0.0.0:1080 0.0.0.0:* LISTEN 1465/haproxy
    tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 1465/haproxy
    udp 0 0 0.0.0.0:53653 0.0.0.0:* 1464/haproxy

    步骤二、开启HAProxy管理页面,及时查看调度器状态


    点击【监听器】->【添加监听器】,如图-6所示.




    图-6



    2)创建监听器名称,并监听1080端口,如图-7所示




    图-7



    3)创建后端服务器组名,如图-8所示。




    图-8



    4)添加后端服务器。如图-9所示。


    点击刚才所创建的监听器名称—>【后端服务器组】->【添加】




    图-9



    5)将两台ha-ke主机添加进后端服务器,并配置监听端口。图-10、图11所示




    图-10





    图-11



    6)使用浏览器访问http://华为公网IP,测试调度器是否正常工作,客户端访问http://华为公网IP:1080/stats测试状态监控页面是否正常。访问状态监控页的内容。如图-12、图-13所示。


    用户名:admin 密码:admin




    图-12





    图-13



    7)、在ecs-proxy访问ha-ke-0001或ha-ke-0002进行测试。


    [root@ecs-proxy ~]# mysql -uroot -h 192.168.1.48 -P3308 -p’123456’ -e “select @@hostname”
    ±-----------+
    | @@hostname |
    ±-----------+
    | mha-0003 |
    ±-----------+
    [root@ecs-proxy ~]# mysql -uroot -h 192.168.1.48 -P3308 -p’123456’ -e “select @@hostname”
    ±-----------+
    | @@hostname |
    ±-----------+
    | mha-0004 |
    ±-----------+



    6 案例6、构建Keepalived高可用服务器


    6.1 问题


    本案例要求在案例五的两台主机上构建keepalived高可用服务器



    • 利用keepalived实现两台Haproxy服务器的高可用
  • 配置VIP为192.168.1.50
  • 配置keepalived监控haproxy服务
  • 6.2 步骤

    步骤一、部署keepalived服务。

    1)给两台主机安装keepalived软件包

    [root@ha-ke-0001 ~]# yum -y install keepalived
    [root@ha-ke-0002 ~]# yum -y install keepalived
    

    2)、修改ha-ke-0001的Keepalived配置文件。

    删除不必要的配置内容

    [root@ha-ke-0001 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
    [root@ha-ke-0001 ~]# sed -i '35,$ d' /etc/keepalived/keepalived.conf
    [root@ha-ke-0001 ~]# sed -i '4,16 d' /etc/keepalived/keepalived.conf
    [root@ha-ke-0001 ~]# sed -i '3a router_id ke1\n vrrp_iptables' /etc/keepalived/keepalived.conf
    

    修改ha-ke-0001服务器keepalived配置文件。

    [root@ha-ke-0001 ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    

    global_defs {
    router_id ke1 #设置路由ID号
    vrrp_iptables #清除防火墙的拦截规则
    }

    vrrp_instance VI_1 {
    state MASTER #主服务器为MASTER(需大写)
    interface eth0 #VIP配在哪个网卡上(根据实际网卡名称书写)
    virtual_router_id 51 #主备服务器VRID号必须一致
    priority 100 #服务器优先级,优先级高优先获取VIP
    advert_int 1 #MASTER和BACKUP之间通信检查的时间间隔,单位为秒,默认是1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress { #谁是主服务器就获得该VIP
    192.168.1.50
    }
    }
    [root@ha-ke-0001 ~]# systemctl restart keepalived.service
    [root@ha-ke-0001 ~]# systemctl enable keepalived.service

    3)修改ha-ke-0002服务器keepalived配置文件。


    [root@ha-ke-0002 ~]#scp [email protected]:/etc/keepalived/keepalived.conf /etc/keepalived
    [root@ha-ke-0002 ~]# sed -i “/state/s/MASTER/BACKUP/” /etc/keepalived/keepalived.conf
    [root@ha-ke-0002 ~]# sed -i “/priority/s/100/90/” /etc/keepalived/keepalived.conf

    修改后的结果如下:
    [root@ha-ke-0002 ~]# cat /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived

    global_defs {
    router_id ke1
    vrrp_iptables
    }

    vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    192.168.1.50
    }
    }
    [root@ha-ke-0002 ~]# systemctl restart keepalived.service
    [root@ha-ke-0002 ~]# systemctl enable keepalived.service

    步骤二、申请虚拟VIP地址192.168.1.50,并绑定。


    1)、登录ha-ke-0001和ha-ke-0002查看VIP信息


    ha-ke-0001


    [root@ha-ke-0001 ~]# ip addr show eth0
    2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:0d:bc:e5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.48/24 brd 192.168.1.255 scope global noprefixroute dynamic eth0
    valid_lft 31530366sec preferred_lft 31530366sec
    inet 192.168.1.50/32 scope global eth0 #VIP地址
    valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe0d:bce5/64 scope link
    valid_lft forever preferred_lft forever

    ha-ke-0002

    [root@ha-ke-0002 ~]# ip addr show eth0
    2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:eb:36:70 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.49/24 brd 192.168.1.255 scope global noprefixroute dynamic eth0
    valid_lft 31530361sec preferred_lft 31530361sec
    inet6 fe80::f816:3eff:feeb:3670/64 scope link 
    valid_lft forever preferred_lft forever
    

    2)、申请虚拟IP,并绑定ha-ke-0001和ha-ke-0002云服务器,如图-14、图-15所示。

    图-14

    图-15

    3)、在ecs-proxy访问ha-ke-0001或ha-ke-0002上的VIP地址进行测试。

    [root@ecs-proxy ~]# mysql -uroot -h 192.168.1.50 -P3308 -p'123456' -e "select @@hostname"
    +------------+
    | @@hostname |
    +------------+
    | mha-0003 |
    +------------+
    [root@ecs-proxy ~]# mysql -uroot -h 192.168.1.50 -P3308 -p'123456' -e "select @@hostname"
    +------------+
    | @@hostname |
    +------------+
    | mha-0004|
    +------------+
    

    步骤三、配置keepalived监控haproxy服务,实现高可用

    keepalived只能做到对网络故障和Keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,才会进行切换。但是在工作中,有业务服务停止而Keepalived服务器还在工作的情况,这就会导致用户访问的VIP无法找到对应的服务。那么如何解决业务服务宕机,可以漂移到备节点使之接管提供服务呢?

    方法一:以通过编写脚本对业务进程进行检测监控。

    方法二:使用Keepalived的配置文件参数触发发写好的监测服务脚本。

    方式一:

    1)、脚本如下

    [root@ha-ke-0001 ~]# cat /root/check_ha.sh 
    #!/bin/bash
    while true
    do
    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
    systemctl stop keepalived
    fi
    sleep 5
    done
    [root@ha-ke-0001 ~]# chmod +x /root/check_ha.sh 
    [root@ha-ke-0001 ~]# /root/check_ha.sh &
    

    2)确认VIP当前在ha-ke-0001云主机上。

    [root@ha-ke-0001 ~]# ip addr show eth0
    2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:9f:31:6c brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.48/24 brd 192.168.1.255 scope global noprefixroute dynamic eth0
    valid_lft 31523664sec preferred_lft 31523664sec
    inet 192.168.1.50/32 scope global eth0
    valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe9f:316c/64 scope link 
    valid_lft forever preferred_lft forever
    

    3)、模拟haproxy服务挂掉,查看IP是否发生切换。

    [root@ha-ke-0001 ~]# systemctl stop haproxy
    [root@ha-ke-0001 ~]# ip addr show eth0
    2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:9f:31:6c brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.48/24 brd 192.168.1.255 scope global noprefixroute dynamic eth0
    valid_lft 31523643sec preferred_lft 31523643sec
    inet6 fe80::f816:3eff:fe9f:316c/64 scope link 
    valid_lft forever preferred_lft forever
    

    4)、此时,备节点已经接管VIP

    [root@ha-ke-0002 ~]# ip addr show eth0
    2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:aa:11:5b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.49/24 brd 192.168.1.255 scope global noprefixroute dynamic eth0
    valid_lft 31523614sec preferred_lft 31523614sec
    inet 192.168.1.50/32 scope global eth0      #此时ha-ke-0002主机获得VIP地址
    valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:feaa:115b/64 scope link 
    valid_lft forever preferred_lft forever
    

    方式二、使用Keepalived的配置文件参数触发发写好的监测服务脚本。

    vrrp_script:自定义资源监控脚本,vrrp实例根据脚本返回值进行下一步操作。track_script:调用vrrp_script定义的脚本去监控资源.

    定义:

    vrrp_script {

    script “SHELL指令或一个可执行的脚本”

    interval X #X表示时间间隔,单位为秒,默认为1秒

    }

    调用:

    track_script {

    }

    1)、更新ha-ke-0001上keepalived服务的配置。

    [root@ha-ke-0001 ~]# sed -i '6a vrrp_script chk_haproxy \{ \n script "killall -0 haproxy" \n interval 2 \n\}' /etc/keepalived/keepalived.conf
    [root@ha-ke-0001 ~]# sed -i '24a track_script \{ \n chk_haproxy \n \}' /etc/keepalived/keepalived.conf
    [root@ha-ke-0001 ~]# systemctl restart keepalived
    

    2)、测试方式参考方式一。

    附加知识:

    1、Mysql主从同步的原理概述。

    MySQL主从同步是一个异步的过程,将数据从一个MySQL数据库(master)复制到另一个MySQL数据库(slave),在master和slave之间实现整个复制过程,是由三个线程参与完成的。其中有两个(SQL线程和I/O线程)在slave端,另外一个线程(binlog dump thread)在master端。要实现MySQL主从复制,首先必须打开master端的binlog记录功能,slave从master端获取binlog日志,然后在slave上以相同顺序执行,获取binlog日志中所有记录的SQL操作。

    1)、在slave上执行start slave命令开启主从复制。

    2)、slave服务器的I/O线程会通过master上已经授权的用户连接master服务器,并请求从指定binlog日志文件的指定位置发送binlog日志内容。

    3)、master服务器接收到slave服务器I/O线程的请求后,其上负责复制的binlog dump thread线程会根据slave的请求,读取指定binlog日志,然后返回给salve端的I/O线程。返回的信息中除了binlog日志外,还有master服务端记录的新binlog日志文件名,以及下一个指定执行更新位置。

    4)、slave服务器的I/O线程获取到master服务器binlog dump thread发送的数据,会将binlog日志内容依次写到salve端自身的中继日志(relay log)最末端,并将新的binlog日志名和位置记录到master-info文件中,以便下一次更新。

    5)、slave服务器的SQL线程会实时检测本地中继日志中I/O线程新增加的日志内容,把中继日志中的内容解析为SQL语句,并在Slave服务器上按解析SQL语句的位置顺序,执行应用这些SQL语句。

    经过上面的过程,master和slave端的数据是完全一样的。

    2、主从复制延迟的原因。

    1)、主库的从库太多,,导致复制延迟。

    从库数量3~5个为宜,要复制的节点数过多,会导致复制延迟。

    2)、从库硬件比主库差,导致复制延迟。

    可能会因为机器配置不当,磁盘I/O、CPU、内存等各方面因素造成复制延迟。

    3)、慢SQL语句过多。

    一条SQL语句执行时间是10秒,那么从执行完毕到从库上能查到数据至少需要10秒,这样就延迟10秒了。

    4)、主库读写压力过大,导致复制延迟

    提升硬件设备配置,架构前端加缓存层。

    5)、主从库之间的网络延迟。

    主从库的网卡、网线、连接的交换机等网络设备都有可能导致复制延迟。

    3、解答Keepalived的工作原理?

    VRRP(Virtual Router Redundancy protocal,虚拟路由冗余协议)

    Keepalived高可用对之间是通过VRRP进行通信的,VRRP通过竞选机制来确定主备,主的优先级高于备。因此,工作时主优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。在Keepalived服务对之间,只有主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,备监听不到主发送的广播包时,就会启动相关服务阶段资源,保障业务的连续性。

    4、什么是脑裂?

    由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的就是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端数据不一致或造成数据丢失,这种其情况就称为脑裂。

你可能感兴趣的:(达内云计算培训笔记,linux)