Mysql分布式系统:
CAP标准:分布式系统最多可以实现其中的两点,常用的有AP和AC;
C:一致性
A:可用性
P:网络分区(分裂)容错性
mysql的切分:
垂直切分:将一个数据库中的多张表分散到多个mysql服务器中(尽量让那些需要做联合查询的表位于同一个mysql数据库中,比如JOIN操作,并且尽量让使用频繁的表位于不同mysql数据库);
水平切分:将某个表按行切分以后分布到不同的数据库中;
Mysql复制之主节点的高可用:
MMM:Multi Master MySQL
MHA:Master HA
安装包下载:https://blog.csdn.net/debimeng/article/details/80542521
MHA Manager:通常单独部署在一台独立机器上,管理多个master/slave集群,每个master/slave集群称作一个application;
包含的组件:
masterha_check_ssh:MHA依赖的环境监测工具;
masterha_check_repo:mysql复制环境监测工具;
MHA manager要有拥有控制每个slave数据库的权限,从而才能对其执行切换主节点、将新晋主节点设置为可写(因为从节点一般默认是不可写的(read_only));
masterha_manager:MHA服务主程序;
masterha_check_status:MHA运行状态探测工具;
masterha_master_monitor:mysql master节点可用性监测工具;
masterha_master_switch:master节点切换工具;
masterha_conf_host:添加或删除配置节点;
masterha_stop:关闭MHA服务的工具;
MHA Node:运行在每台mysql服务器上(master/slave/manager),它通过监控具备解析和清理logs功能的脚本来加快故障转移;
包含的组件:
save_binary_logs:保存和复制master的二进制日志;
apply_diff_relay_logs:识别差异的中继日志事件并应用于其它slave;
在提升一个从节点为主节点时,会事先合并所有从节点中的中继日志事件,然后将其应用到一个从节点上,使其作为新的主节点;
purge_relay_logs:清除中继日志(不会阻塞SQL线程)
VIP(IP地址漂移):当新的主节点接替故障主节点工作时,不仅是需要更新新晋主节点的数据,其IP地址也要进行改变,进程原来主节点的IP,才能继续提供服务;我们可以他通过keepalived来实现IP地址的切换,也可以使用MHA自带的脚本来实现IP地址的切换;
自定义扩展功能:
secondary_check_script:通过多条网络路由检测master的可用性;
master_ip_failover_script:更新application使用的masterip;
shutdown_script:强制关闭master节点;
report_script:发送报告;
init_conf_load_script:加载初始配置参数;
master_ip_online_change_script:更新master节点的ip地址;
MHA自身提供了管理端和节点端,其中管理端自己运行在一个主机上,每个集群中的mysql服务器都要运行节点端,其实现高可用的方式就是通过管理端监控(可以是心跳信息等方式)mysql复制集群中的主节点,当发现主节点故障以后,就会自动的在从节点中选取(一般是数据比较全面的)一台mysql服务器,作为主节点,然后让剩下的从节点以新节点为主节点,进而从其继续复制数据;当原来的主节点重新上线以后,其也不能抢占现有主节点,而是作为从节点提供服务;此技术是用于mysql的主从复制结构中的;
Galera Cluster:与MMM或MHA不同,其是基于wresp协议来完成高可用的;
Galera Cluster不是基于mysql的各种复制结构来实现可用性的(即不是通过mysql协议读取二进制日志文件来传输数据的),而是通过更底层的wresp协议将mysql服务器节点(不区分主从节点)上的发生变化的数据同步到其他节点;
引入中间件:
可以通过中间件实现读写分离,在中间件中对发来的mysql数据请求做分析,如果过是读请求就发送给从服务器,如果是写请求就发送给写服务器,并且还以可以通过中间件做负载均衡,将读请求分散的发送到众多的从服务器中,对于主节点的可用性,可以布置多个主节点,当中间件调度写请求时,同时对多个主节点进行写操作,从而实现数据的同步,也增加了主节点的可用性;当请求过多是还可以在中间件中创建等待队列,缓解mysql服务器的压力;不过这种中间件一般都要自己开发,有一定的难度;
示例:
1.MHA
拓扑结构:一共四个节点,一个MHA Manager节点、一个Mysql主节点、两个Mysql从节点;
a.配置hosts文件,使其能够通过主机名通信;
~]# cat /etc/hosts
192.168.80.143 master
192.168.80.136 manager
192.168.80.131 slave1
192.168.80.134 slave2
b.设置主节点的配置文件(配置同下面从节点)及添加复制时使用的授权用户;
systemctl start mariadb.service
MariaDB [(none)]> show master status;
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.80.%' identified by 'replpass';
MariaDB [(none)]> flush privileges;
c.设置从节点的配置文件;
~]# cat /etc/my.cnf
# The MariaDB server
[mysqld]
skip_name_resolve = ON
innodb_file_per_table = ON
log_bin = master-bin
relay_log = relay-log
server_id = 2
read_only = 1
relay_log_purge = 0
d.配置主从复制,将主节点的数据复制到从节点;
mysql> change master to master_host='192.168.80.143',master_user='repluser',master_password='replpass',master_log_file='master-bin.000004',master_log_pos=498;
将上面MariaDB [(none)]> show master status;命令输出的pos位置填入,即可一起将授权账号一并复制过来了,或者自己手动添加也行;
mysql> start slave;
e.在主节点上添加一个给MHA使用的账号;
MariaDB [(none)]> grant all on *.* to 'mhauser'@'192.168.80.%' identified by 'mhapqss';
MariaDB [(none)]> flush privileges;
f.配置所有节点可以通过ssh互通;
~]# ssh-keygen -t rsa -P ''
~]# cat .ssh/id_rsa.pub >> .ssh/authorized_keys
~]# chmod og= .ssh/authorized_keys
~]# scp -p .ssh/id_rsa .ssh/authorized_keys .ssh/id_rsa.pub centos7:/root/.ssh/
g.在manager主机上安装mha4mysql-manager和mha4mysql-node、在master和slave节点上安装mha4mysql-node;(安装之前需要配置好epel源)
~]# yum install ./mha4mysql-node-0.58-0.el7.centos.noarch.rpm
~]# yum install ./mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
h.编辑MHA的配置文件;配置文件路径需要自己创建:mkdir /etc/masterha/
global配置:全局配置,为各application提供默认配置;
user=NAME:指定mysql中的账户;
password=PASSWORD:指定账户密码;
manager_workdir=PATH:指定其管理的app存放数据的目录;
manager_log=PATH:指定某个app的日志文件位置;
remote_workdir=PATH:管理远端节点的工作目录;
ssh_user=NAME:指定登录ssh的用户;
repl_user=NAME:指定mysql中具有主从复制权限的用户;
repl_password=PASSWORD:指定用户密码;
ping_interval=1:用于检测主节点是否在线的间隔时间;
application配置:用来指定单个application的信息;
server#:标记每个节点;
hostname=IP_ADDR:指定每个节点的IP地址;
ssh_port=PORT:指定ssh的端口号;
candidate_master=1|0:是否可以参与称为主节点;
Note:更多参数请查看官方文档;
示例:
~]# mkdir /etc/masterha/
~]# cat /etc/masterha/app.cnf
[server default]
user=mhauser
password=mhapass
manager_workdir=/data/masterha/app
master_log=/data/masterha/app/manager.log
remote_workdir=/data/masterha/app
ssh_user=root
repl_user=repluser
repl_password=replpass
ping_interval=1
[server1]
hostname=192.168.80.143
candidate_master=1
[server2]
hostname=192.168.80.131
candidate_master=1
[server3]
hostname=192.168.80.134
candidate_master=1
~]# masterha_check_ssh --conf=/etc/masterha/app.cnf
测试ssh远程登录是否可用;
~]# masterha_check_repl --conf=/etc/masterha/app.cnf
~]# nohup master_manager --conf=/etc/masterha/app.cnf > /data/masterha/app/manager.log 2>&1 &
启动MHA;
~]# masterha_check_status --conf=/etc/masterha/app.cnf
检查MHA的状态;
模拟主节点故障:会发现从节点中有一个会接替主节点继续工作;
Note:当故障的主节点修复以后,可以当做从节点重新上线,上线步骤为:先从现有的主节点的备份中复制一份数据,指向新的主节点,然后再通过二进制日志文件重做最新的数据,然后上线即可,并且设置read_only为1;
错误借鉴:https://blog.51cto.com/arthur376/1812640
https://www.cnblogs.com/polestar/p/5371080.html
Note:根据马哥视频做的学习笔记,如有错误,欢迎指正;侵删