MySQL高可用MHA集群架构案例
2020-04-07 12:27
1441 查看
(这个图片是当时的,我配置的时候ip有变动,懒得调了)
这是一个高可用方案MHA的经典企业版本的架构案例,希望可以帮到大家,文章下面涉及到二进制日志方面,请参考我的另一个博客文档“二进制回复案例”,可以教你设置二进制日志
1.IP地址规划: yulong-manager : 192.168.136.160(管理节点) yulong-master : 192.168.136.157(主库) yulong-candicate : 192.168.136.158(从库,备选主库,) yulong-slave : 192.168.136.159(从库)
2.环境(四台主机上全部跑一遍)#(脚本): #!/bin/bash #yum安装的mysql默认目录为:/var/lib/mysql lujing=/var/lib/mysql #下载semange命令 yum install policycoreutils-python-2.5-33.el7.x86_64 -y #调整selinux的上下文的默认值 semanage fcontext -a -t mysqld_db_t "$lujing(/.*)?" #接下来再将目录的安全上下文恢复为刚刚设置的默认值即可 restorecon -Rv $lujing #启动sql服务 systemctl restart mysqld #防火墙放行3306 firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --reload #配置主机名解析 a='192.168.136.160 yulong-manager' b='192.168.136.157 yulong-master' c='192.168.136.158 yulong-candicate' d='192.168.136.159 yulong-slave01' echo ${a} >> /etc/hosts echo ${b} >> /etc/hosts echo ${c} >> /etc/hosts echo ${d} >> /etc/hosts #同步时间程序安装 yum install chrony -y systemctl enable chronyd systemctl start chronyd
3.manager同步互联网时间: #允许192.168.136.0/24网段的主机同步: [root@yulong-manager ~]# vim /etc/chrony.conf 键入追加:allow 192.168.136.0/24 #重启服务 [root@yulong-manager ~]# systemctl restart chronyd #检查是否同步成功 [root@yulong-manager ~]# chronyc sources #防火墙放行NTP [root@yulong-manager ~]# firewall-cmd --add-service=ntp --permanent success [root@yulong-manager ~]# firewall-cmd --reload success
4.配置其他主机节点的时间服务器为manager #更改配置文件,与manager同步起来 vim /etc/chrony.conf 键入追加:server yulong-manager iburst #重启服务 systemctl restart chronyd #检查是否同步成功 chronyc sources #同步成功示例: [root@yulong-candicate-master ~]# chronyc sources 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* yulong-manager 3 6 17 13 +582ns[ +22us] +/- 52ms
5.建立SSH免密钥登陆环境 5.1各个主机之间生成密钥 ssh-keygen 5.2各个主机运行以下脚本拷贝公钥 vim ssh-copy.sh #脚本内容 #!/usr/bin/bash for i in 160 157 158 159 do ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.136.$i done 5.3脚本给予可运行权限并且运行: chmod 777 ssh-copy.sh ./ssh-copy.sh
6.配置MySQL半同步复制(所有主从节点) 6.1查看自己是否有半同步插件 mysql> show variables like '%plugin_dir%'; +---------------+--------------------------+ | Variable_name | Value | +---------------+--------------------------+ | plugin_dir | /usr/lib64/mysql/plugin/ | +---------------+--------------------------+ 1 row in set (0.42 sec) 6.2检查是否支持插件: mysql> show variables like '%have_dynamic_loading%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | have_dynamic_loading | YES | +----------------------+-------+ 1 row in set (0.00 sec) 6.3分别在主从节点上安装相关的插件 mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; Query OK, 0 rows affected (0.23 sec) mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; Query OK, 0 rows affected (0.01 sec) 6.4确认插件已经激活 mysql> select plugin_name, plugin_status from information_schema.plugins -> where plugin_name like '%semi%'; +----------------------+---------------+ | plugin_name | plugin_status | +----------------------+---------------+ | rpl_semi_sync_master | ACTIVE | | rpl_semi_sync_slave | ACTIVE | +----------------------+---------------+ 2 rows in set (0.10 sec) 6.5查看半同步信息,应该是关闭off状态 mysql> show variables like '%semi_sync%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_semi_sync_master_enabled | OFF | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | +-------------------------------------------+------------+ 8 rows in set (0.01 sec)
7.配置主从同步 7.1修改主库配置文件: vim /etc/my.cnf [mysqld] log_bin=/var/lib/binlogs/master server_id=157 ##上面这两条是sql二进制文件位置,不用动,然后手动添加如下 gtid_mode=ON enforce_gtid_consistency=true rpl_semi_sync_master_enabled=1 #启用半同步:1启用,0关闭 rpl_semi_sync_master_timeout=1000 # 毫秒单位,该参数主服务器等待确认消息10秒后,不再等待,变为异步方式。 rpl_semi_sync_slave_enabled=1 relay_log_purge=0 binlog-ignore-db=mysql 7.2重新启动服务 [root@yulong-master ~]# systemctl restart mysqld 7.3创建复制用户和管理用户 #创建复制用户mharep并授权(所有库的复制权限) mysql> create user 'mharep'@'192.168.136.%' identified -> with mysql_native_password by 'Com.123!'; Query OK, 0 rows affected (1.00 sec) mysql> grant replication slave on *.* to 'mharep'@'192.168.136.%'; Query OK, 0 rows affected (0.00 sec) #创建管理用户manager并授权(所有权限全部给manager) mysql> create user 'manager'@'192.168.136.%' identified -> with mysql_native_password by 'Com.123!'; Query OK, 0 rows affected (0.01 sec) mysql> grant all privileges on *.* to 'manager'@'192.168.136.%'; Query OK, 0 rows affected (0.00 sec)
8.candicate master配置(备份master) 8.1修改主配置文件 vim /etc/my.cnf [mysqld] log_bin=/var/lib/binlogs/slave01 server_id=158 #上面这两条是sql二进制文件位置,不用动,然后手动添加如下 binlog-ignore-db=mysql rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 rpl_semi_sync_slave_enabled=1 relay_log_purge=0 gtid_mode=ON enforce_gtid_consistency=true skip_slave_start 8.2重新启动服务 [root@yulong-candicate-master ~]# systemctl restart mysqld
9.slave配置 9.1修改主配置文件 vim /etc/my.cnf [mysqld] log_bin=/var/lib/binlogs/slave02 server_id=159 #上面这两条是sql二进制文件位置,不用动,然后手动添加如下 binlog-ignore-db=mysql rpl_semi_sync_slave_enabled=1 read_only=1 gtid_mode=ON enforce_gtid_consistency=true skip_slave_start 8.2重新启动服务 [root@yulong-slave ~]# systemctl restart mysqld
10.1查看master文件进程的状态 mysql> show master status \G(主库) *************************** 1. row *************************** File: master.000009 Position: 1907 Binlog_Do_DB: Binlog_Ignore_DB: mysql Executed_Gtid_Set: d912f36e-52dd-11ea-a0c9-000c294062df:1-4 1 row in set (0.00 sec) mysql> create user 'root'@'192.168.136.%' identified with mysql_native_password by 'Com.123!'; Query OK, 0 rows affected (0.00 sec) mysql> grant all on *.* to 'root'@'192.168.136.%'; Query OK, 0 rows affected (0.00 sec)
11.主库上进行授权(让别的库能备份master上的) mysql> create user 'root'@'192.168.136.%' identified with mysql_native_password by 'Com.123!'; Query OK, 0 rows affected (0.01 sec)
12:两个从库都基于文件备份过来了,然后把主库的备份恢复(我这里是一个从库的例子) [root@yulong-slave mysql]# mysqldump -h 192.168.136.157 -uroot --password='Com.123!' --all-databases --routines --events --single-transaction --master-data > dump.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@yulong-slave01 mysql]# mysql -uroot -pCom.123! < dump.sql mysql: [Warning] Using a password on the command line interface can be insecure.
13.从库上指定master,首先是基于文件的复制(两个从库都要进行,master的信息再第10步中) mysql> change master to master_host='192.168.136.157', -> master_user='mharep',master_password='Com.123!', -> master_log_file='master.000009',master_log_pos=1907; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> stert slave; mysql> start slave; Query OK, 0 rows affected (0.02 sec) #启动同步 mysql> show slave status\G #两个从库都要查看 (此时IO线程和sql线程均为开启)
14.将主库设置为只读,并确保所用从库都能与主库同步。因为主从之间不应该有任何数据的不一致 mysql> set @@global.read_only = ON;
15.使用GTID同步:(两个从库进行) 15.1指定主库GTID进行复制 mysql> stop slave;(停止当前的备份) mysql> change master to master_host='192.168.136.157', -> master_port=3306,master_user='mharep', -> master_password='Com.123!', master_auto_position = 1 -> ; Query OK, 0 rows affected, 2 warnings (0.01 sec) 15.2启动slave中继日志 mysql> start slave; Query OK, 0 rows affected (0.02 sec) 15.4查看slave状态信息: 此时两个线程肯定开启了
16.master主库上创建库验证(已经同步): 我们可以创建一个库验证,已经成功。
管理工具下载地址,linux不行的话就用windows,下载之后传进linux
wget -c https://github.com/yoshinorim/mha4mysqlnode/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
wget -c https://github.com/yoshinorim/mha4mysqlmanager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
12.安装MHA程序 12.1安装MySQL server节点(主库和备选主库上安装) [root@yulong-master ~]# yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm [root@yulong-candicate-master ~]# yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch_\(2\).rpm 12.2安装管理manager节点(管理者安装) [root@yulong-manager ~]# yum install epel-release -y [root@yulong-manager ~]# yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm(node是基础,才能manager的安装) [root@yulong-manager ~]# yum localinstall mha4mysql-manager-0.58-0.el7.centos.noarch.rpm -y #如果还不行,请安装epel-release源
13.配置MHA(管理节点) [root@yulong-manager ~]# mkdir -p /etc/mha [root@yulong-manager ~]# mkdir -p /var/log/mha/app1 [root@yulong-manager ~]# vim /etc/mha/app1.cnf [server default] manager_workdir=/masterha/app1 manager_log=/masterha/app1/manager.log user=manager password=Com.123! ssh_user=root repl_user=mharep repl_password=Com.123! ping_interval=2 [server1] hostname=192.168.136.157 port=3306 master_binlog_dir=/var/lib/binlogs/master/ #指定库的二进制文件目录(/etc/my.cnf查看) candidate_master=1 [server2] hostname=192.168.136.158 port=3306 master_binlog_dir=/var/lib/binlogs/slave01/ candidate_master=1 #是否要成为备选master [server3] hostname=192.168.136.159 port=3306 master_binlog_dir=/var/lib/binlogs/slave02/ no_master=1 #不会成为备选master
14.ssh的有效性验证:(管理节点) [root@yulong-manager ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf Wed Mar 4 19:33:50 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Wed Mar 4 19:33:50 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf.. Wed Mar 4 19:33:50 2020 - [info] Reading server configuration from /etc/mha/app1.cnf.. Wed Mar 4 19:33:50 2020 - [info] Starting SSH connection tests.. Wed Mar 4 19:33:51 2020 - [debug] Wed Mar 4 19:33:50 2020 - [debug] Connecting via SSH from root@192.168.136.157(192.168.136.157:22) to root@192.168.136.158(192.168.136.158:22).. Wed Mar 4 19:33:50 2020 - [debug] ok. Wed Mar 4 19:33:50 2020 - [debug] Connecting via SSH from root@192.168.136.157(192.168.136.157:22) to root@192.168.136.159(192.168.136.159:22).. Wed Mar 4 19:33:51 2020 - [debug] ok. Wed Mar 4 19:33:52 2020 - [debug] Wed Mar 4 19:33:51 2020 - [debug] Connecting via SSH from root@192.168.136.159(192.168.136.159:22) to root@192.168.136.157(192.168.136.157:22).. Wed Mar 4 19:33:51 2020 - [debug] ok. Wed Mar 4 19:33:51 2020 - [debug] Connecting via SSH from root@192.168.136.159(192.168.136.159:22) to root@192.168.136.158(192.168.136.158:22).. Wed Mar 4 19:33:52 2020 - [debug] ok. Wed Mar 4 19:33:52 2020 - [debug] Wed Mar 4 19:33:50 2020 - [debug] Connecting via SSH from root@192.168.136.158(192.168.136.158:22) to root@192.168.136.157(192.168.136.157:22).. Wed Mar 4 19:33:51 2020 - [debug] ok. Wed Mar 4 19:33:51 2020 - [debug] Connecting via SSH from root@192.168.136.158(192.168.136.158:22) to root@192.168.136.159(192.168.136.159:22).. Wed Mar 4 19:33:51 2020 - [debug] ok. Wed Mar 4 19:33:52 2020 - [info] All SSH connection tests passed successfully.
15.集群有效性验证(MySQL必须都启动)(管理节点) [root@yulong-manager ~]# mkdir /tmp/mha_manager.log [root@yulong-manager /]# masterha_check_repl --conf=/etc/mha/app1.cnf Wed Mar 4 21:12:53 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Wed Mar 4 21:12:53 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf.. Wed Mar 4 21:12:53 2020 - [info] Reading server configuration from /etc/mha/app1.cnf.. Wed Mar 4 21:12:53 2020 - [info] MHA::MasterMonitor version 0.58. Wed Mar 4 21:12:54 2020 - [info] GTID failover mode = 1 Wed Mar 4 21:12:54 2020 - [info] Dead Servers: Wed Mar 4 21:12:54 2020 - [info] Alive Servers: Wed Mar 4 21:12:54 2020 - [info] 192.168.136.157(192.168.136.157:3306) Wed Mar 4 21:12:54 2020 - [info] 192.168.136.158(192.168.136.158:3306) Wed Mar 4 21:12:54 2020 - [info] 192.168.136.159(192.168.136.159:3306) Wed Mar 4 21:12:54 2020 - [info] Alive Slaves: Wed Mar 4 21:12:54 2020 - [info] 192.168.136.158(192.168.136.158:3306) Version=8.0.19 (oldest major version between slaves) log-bin:enabled Wed Mar 4 21:12:54 2020 - [info] GTID ON Wed Mar 4 21:12:54 2020 - [info] Replicating from 192.168.136.157(192.168.136.157:3306) Wed Mar 4 21:12:54 2020 - [info] Primary candidate for the new Master (candidate_master is set) Wed Mar 4 21:12:54 2020 - [info] 192.168.136.159(192.168.136.159:3306) Version=8.0.19 (oldest major version between slaves) log-bin:enabled Wed Mar 4 21:12:54 2020 - [info] GTID ON Wed Mar 4 21:12:54 2020 - [info] Replicating from 192.168.136.157(192.168.136.157:3306) Wed Mar 4 21:12:54 2020 - [info] Not candidate for the new Master (no_master is set) Wed Mar 4 21:12:54 2020 - [info] Current Alive Master: 192.168.136.157(192.168.136.157:3306) Wed Mar 4 21:12:54 2020 - [info] Checking slave configurations.. Wed Mar 4 21:12:54 2020 - [info] Checking replication filtering settings.. Wed Mar 4 21:12:54 2020 - [info] binlog_do_db= , binlog_ignore_db= mysql Wed Mar 4 21:12:54 2020 - [info] Replication filtering check ok. Wed Mar 4 21:12:54 2020 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking. Wed Mar 4 21:12:54 2020 - [info] Checking SSH publickey authentication settings on the current master.. Wed Mar 4 21:12:54 2020 - [info] HealthCheck: SSH to 192.168.136.157 is reachable. Wed Mar 4 21:12:54 2020 - [info] 192.168.136.157(192.168.136.157:3306) (current master) +--192.168.136.158(192.168.136.158:3306) +--192.168.136.159(192.168.136.159:3306) Wed Mar 4 21:12:54 2020 - [info] Checking replication health on 192.168.136.158.. Wed Mar 4 21:12:54 2020 - [info] ok. Wed Mar 4 21:12:54 2020 - [info] Checking replication health on 192.168.136.159.. Wed Mar 4 21:12:54 2020 - [info] ok. Wed Mar 4 21:12:54 2020 - [warning] master_ip_failover_script is not defined. Wed Mar 4 21:12:54 2020 - [warning] shutdown_script is not defined. Wed Mar 4 21:12:54 2020 - [info] Got exit code 0 (Not master dead). MySQL Replication Health is OK.
16.开启MHA(管理节点) [root@yulong-manager /]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover &> /tmp/mha_manager.log & [1] 12890 [root@yulong-manager /]# masterha_check_status --conf=/etc/mha/app1.cnf app1 (pid:12890) is running(0:PING_OK), master:192.168.136.157
17.将当前主库停掉 [root@yulong-master ~]# systemctl stop mysqld
18.备选主库上上查看新的主库 已经丛157,跳转到158 mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.136.158 Master_User: mharep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: slave01.000005 Read_Master_Log_Pos: 235 Relay_Log_File: yulong-slave-relay-bin.000006 Relay_Log_Pos: 405 Relay_Master_Log_File: slave01.000005 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 235 Relay_Log_Space: 870 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 158 Master_UUID: d9a393c6-5d00-11ea-a5d5-000c296c0add Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: d9a393c6-5d00-11ea-a5d5-000c296c0add:3-4 Executed_Gtid_Set: d912f36e-52dd-11ea-a0c9-000c294062df:1-12, d9a393c6-5d00-11ea-a5d5-000c296c0add:1-4, dd56aada-5de1-11ea-ab41-000c29ada657:1-5, e060504a-5dfb-11ea-8fab-000c294062df:1-2 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 1 row in set (0.00 sec)
实验完成
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【华为云技术分享】使用sqoop导入mysql数据到hive中
- django执行原始查询sql,并返回Dict字典例子
- SQLAlchemy之backref和back_populates
- sqlite developer注册码(转)
- TP5页面登录错误及服务器是出现 mysqli_real_connect(): (HY000/1045) 解决方法
- 生产环境下Azkaban调度Sqoop,将数据从MySQL导入到hive中的过程分析
- sql中的drop、truncate、delete的区别
- django 链接多个数据库 并使用原生sql实现
- 高性能mysql架构汇总
- Django+pycharm+mysql 实现用户登录/注册
- SQL基础查询语句1:select,insert,delete,drop,update,where,order,or,limit关键词
- 当使用Django2.2.11的版本来对数据库进行操作,出现了django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or ne
- MySQL数据库快问快答(15问) – 运维派
- 用django,mysql设计一个聊天,好友验证,朋友圈功能项目
- 微服务架构下,Mysql读写分离后,数据库CPU飙升卡壳问题解析
- mysql数据库mysql: [ERROR] unknown option '--skip-grant-tables'
- mysql存储过程之循环语句(WHILE,REPEAT和LOOP)用法分析
- mysql的那些事之架构
- mysqlhotcopy备份恢复
- MySQL第一天:架构与存储引擎,锁,事务,设计