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 <<EOF 192.168.1.41 mha-0001 192.168.1.42 mha-0002 192.168.1.43 mha-0003 192.168.1.44 mha-0004 192.168.1.45 mgm 192.168.1.46 mycat-0001 192.168.1.47 mycat-0002 192.168.1.48 ha-ke-0001 192.168.1.49 ha-ke-0002 EOF
3)、在ecs-proxy上更新/root/ansible/hosts配置文件
[root@ecs-proxy DAY01]# cat >> /root/ansible/hosts <<EOF [db] 192.168.1.4[1:4] [mgm] 192.168.1.45 [mycat] 192.168.1.46 192.168.1.47 [hake] 192.168.1.48 192.168.1.49 EOF
步骤二、给四台设备部署安装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</ [root@mha-0004 ~]# mysql -uroot -p'z_zRdqzff7</' mysql> 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 reuser@192.168.1.% |
±---------------------------------------------------------+
| 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 root@192.168.1.252:/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<UP,BROADCAST,RUNNING,MULTICAST> 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 <<EOF
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 <<EOF
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 <user name="root"> <property name="password">123456</property> <property name="schemas">TESTDB</property>
定义只读权限的Mycat连接用户。
[root@mycat-0001 ~]# sed -n 95,99p' /usr/local/mycat/conf/server.xml <user name="readuser"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user>
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
<schema> <table> </table> </schema> 定义逻辑库表
<dataNode> </dataNode> 定义数据节点
<dataHost> </dataHost> 定义数据节点的物理数据源
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 <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<schema name=“TESTDB” checkSQLschema=“false” sqlMaxLimit=“100” dataNode=“testnode” >
</schema>
<dataNode name=“testnode” dataHost=“mycat” database=“testdb” />
<dataHost name=“mycat” maxCon=“1000” minCon=“10” balance=“3”
writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1” slaveThreshold=“100”>
<heartbeat>select user()</heartbeat>
<writeHost host=“master” url=“192.168.1.40:3306” user=“root” password=“123qqq…A”>
<readHost host=“mha-0003” url=“192.168.1.43:3306” user=“readuser” password=“123qqq…A” />
<readHost host=“mha-0004” url=“192.168.1.44:3306” user=“readuser” password=“123qqq…A” />
</writeHost>
</dataHost>
</mycat:schema>
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 root@192.168.1.46:/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 root@192.168.1.48:/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 root@192.168.1.48:/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 keepalivedglobal_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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 foreverha-ke-0002
[root@ha-ke-0002 ~]# ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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_NAME> {
script “SHELL指令或一个可执行的脚本”
interval X #X表示时间间隔,单位为秒,默认为1秒
}
调用:
track_script {
<SCRIPT_NAME>
}
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地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端数据不一致或造成数据丢失,这种其情况就称为脑裂。