MySQL高可用及读写分离
  DcpJeOZ6VzTX 2023年11月02日 40 0

环境准备

主机名

外网

内网

角色

软件

db01

10.0.0.51

172.16.1.51

master

mysql、MHA-node

db02

10.0.0.52

172.16.1.52

slave

mysql、MHA-node

db03

10.0.0.53

172.16.1.53

slave

mysql、MHA-node

db04

10.0.0.54

172.16.1.54

slave

mysql、MHA-node

# 主库修改配置文件
[root@db01 bin]# cat /etc/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/app/mysql/data
log-bin=mysql-bin # 打开binlog
server_id=1  # 不能等于0,且小于从库

[mysql]
prompt = \u@\h [\d] >

#  主库创建主从复制用户
root@localhost [(none)] >grant replication slave on *.* to rep@'172.16.1.%' identified by '123';

# 查看master信息
root@localhost [(none)] >show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      445 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

# 从库修改配置文件
[mysqld]
basedir=/app/mysql
datadir=/app/mysql/data
server_id=2 #从库的可以相同

[mysql]
prompt = \u@\h [\d] >


# 从库执行change master to

change master to
master_host='172.16.1.53',
master_user='rep',
master_password='123',
master_log_file='mysql-bin.000001',
master_log_pos=154,
master_port=3306;
# 打开slave
root@localhost [(none)] >start slave;

# 检查是否有两个Yes
root@localhost [(none)] >show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.51
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 445
               Relay_Log_File: db02-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

MySQL软件简介

MHA Master Haproxy MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能 够很好地解决复制过程中的数据一致性问题,由于不需要在现有的replication中添加额外的服务器,仅 需要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量;另外,安 装简单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。 MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升 为主库),大概0.5-2秒内即可完成。

MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以独 立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上

MHA工作原理:当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有 其他的Slave重新指向新的Master。


MHA架构

MHA最好单独装一台,可以管理多套主从,也不会因为主或从库故障受影响

MySQL高可用及读写分离_部署MHA

MHA工具(网址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads)

各节点里/usr/bin目录下的文件作用

## node节点
[root@db01 bin]# ll
apply_diff_relay_logs 	// 2.对比relay log 找到数据最新的从库
filter_mysqlbinlog 		// 3.截取binlog,relay log
purge_relay_logs 		// 删除relay log(我们要关闭relay log 自动删除的功能),定期清理不用的relay log
save_binary_logs 		// 1.保存宕机主库上的所有binlog events


## manager节点
[root@db01 bin]# ls -1
masterha_check_repl			// 检测主从复制,MHA启动的时候,需要对主从进行检测(可以手动)
masterha_check_ssh 			// 检测ssh免密,MHA manager一定要跟所有库都免密
masterha_check_status 		// 检测MHA启动状态的,systemctl status 服务名(手动)
masterha_conf_host 			// 配置主机,当主库宕机之后,将宕机主库配置,从配置文件中摘除
masterha_manager 			// 启动MHA(手动)systemctl start MHA
masterha_master_monitor 	// 检测主库心跳
masterha_master_switch 		// 做切换
masterha_secondary_check	// 建立TCP连接
masterha_stop 				// 停止MHA systemctl stop MHA

MHA优点总结

1)Masterfailover and slave promotion can be done very quickly
自动故障转移快
2)Mastercrash does not result in data inconsistency
主库崩溃不存在数据一致性问题
3)Noneed to modify current MySQL settings (MHA works with regular MySQL)
不需要对当前mysql环境做重大修改
4)Noneed to increase lots of servers
不需要添加额外的服务器(仅一台manager就可管理上百个replication)
5)Noperformance penalty
性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping
包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。
6)Works with any storage engine
只要replication支持的存储引擎,MHA都支持,不会局限于innodb

部署MHA

先决条件

# 先决条件
1)主库和从库都要开启binlog

2)主库的server_id和从库不同,从库之间也不能相同

3)主库和从库都要创建主从复制用户(但只需要在主库上创建,其他从库会复制过去)
grant replication slave on *.* to rep@'172.16.1.%' identified by '123';

4)所有数据库之间免密
-#创建密钥对
[root@db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db02 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db03 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db04 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

-#推送公钥(主从之间相互免密)(每台都要推包括自己也要推给自己)
[root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 172.16.1.51
[root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 172.16.1.52
[root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 172.16.1.53
[root@db01 ~]# ssh-copy-id -i ~/.ssh/id_dsa.pub 172.16.1.54

-# 检测公钥是否互推完成
[root@db04 ~]# for i in 51 52 53 54;do ssh 172.16.1.$i "echo $i OK";done
51 OK
52 OK
53 OK
54 OK

5)所有库要禁用自动删除relay log的功能(主库虽然没有relay log,但当他挂了之后会变成从库,就会有relay log,所以先配好)(临时和永久两个结合用)
-#临时生效
set global relay_log_purge= 0;
-#永久生效(不用重启)
relay_log_purge=0

6)只在从库设置只读,只能在MySQL里去设置,(不能加到配置文件,不然从库被提升为主库时只有读权限)
set global read_only=1;

7)命令软连接(每台都要做)
[root@db01 ~]# ln -s /app/mysql/bin/mysql /usr/bin/mysql
[root@db01 ~]# ln -s /app/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog

安装node组件

# 安装node组件(所有主机安装node,先下好rpm包)
[root@db01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm

安装manager组件

# 安装manager组件(只装一台(如装在从库db04),其实可以单独一台机器去装)(先下好rpm包)
yum localinstall -y mha4mysql-manager-0.56-0.el6.noarch.rpm

配置MHA

# 配置MHA
1)创建mha配置文件目录(在装manager的机器上)
[root@db04 ~]# mkdir /etc/mha

2)所有库创建mha管理用户(只需要在主库,从库会复制过去)
grant all on *.* to mha@'172.16.1.%' identified by 'mha';
 
3)创建MHA配置文件(在装manager的机器上)
cat >/etc/mha/app1.cnf<<EOF
[server default]
manager_log=/etc/mha/logs/manager.log
manager_workdir=/etc/mha/app1
master_binlog_dir=/app/mysql/data
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=rep
ssh_user=root
ssh_port=22

[server1]                                   
hostname=172.16.1.51
port=3306                                  

[server2]
#candidate_master=1
#check_repl_delay=0
hostname=172.16.1.52
port=3306

[server3]
hostname=172.16.1.53
port=3306

[server4]
hostname=172.16.1.54
port=3306
EOF



4)检测ssh是否是OK
[root@db04 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
Tue Aug  8 12:40:13 2023 - [info] All SSH connection tests passed successfully.

5)检测主从复制
[root@db04 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.

6)启动mha
-# 先创建日志目录
[root@db04 ~]# mkdir /etc/mha/logs

-# 启动
[root@db04 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/logs/manager.log 2>&1 &
[1] 9527

-# 检测是否成功
[root@db04 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:9527) is running(0:PING_OK), master:172.16.1.51

MHA启动

# 机制:
1.MHA做完一次切换后,会自动结束进程
2.MHA做完一次切换后,会移除master配置
3.MHA做完一次切换后,会在工作目录下生成一个锁文件(8个小时) .lock .lck

nohup 						 ## 后台运行
masterha_manager			 ## mha启动命令
--conf=/etc/mha/app1.cnf	 ## 指定配置文件
--remove_dead_master_conf	 ## 在配置文件中,移除宕机的master配置
--ignore_last_failover 		 ## 忽略上一次故障转移
< /dev/null > /etc/mha/logs/manager.log 2>&1 &

MHA日志分析

# 1.gtid检测
GTID failover mode = 0
Starting Non-GTID based failover.
# 2.还没有设置vip切换脚本
master_ip_failover_script is not set. Skipping invalidating dead master IP address.
save_binary_logs \
--command=save \
--start_file=mysql-bin.000002 \
--start_pos=1024 \
--binlog_dir=/app/mysql/data \
--
output_file=/var/tmp/saved_master_binlog_from_172.16.1.51_3306_20230809184858.binlog \
--handle_raw_binlog=1 \
--disable_log_bin=0 \
--manager_version=0.56
# 3.保存binlog
先保存在宕机主库的/var/tmp下
然后scp到manager所在机器的mha工作目录下/etc/mha/app1
再从MHA机器上,发送到新的主库上/var/tmp
# 4.检测配置文件有没有 candidate_master=1
Candidate masters from the configuration file:
Non-candidate masters:
# 5.所有其他从库想要加进集群
CHANGE MASTER TO MASTER_HOST='172.16.1.52', MASTER_PORT=3306, MASTER_LOG_FILE='mysqlbin.000002', MASTER_LOG_POS=154, MASTER_USER='rep', MASTER_PASSWORD='123';

## MHA切换优先级
1.candidate_master
2.数据量最新
3.配置文件中server标签值,越小,优先级越高

基于GTID主从复制的MHA

# 主库
## 修改配置文件开启gtid mode
-# 临时开启
set global gtid_mode=1;
-#永久开启(记得重启)
vim /etc/my.cnf
[mysqld]
gtid_mode=ON                
enforce_gtid_consistency
## 重启数据库
systemctl restart mysqld


# 从库
## 修改配置文件开启gtid mode(和binlog 不确定要不要开?应该不开)
-# 临时开启
set global gtid_mode=1;
-#永久开启(记得重启)
vim /etc/my.cnf
[mysqld]
gtid_mode=ON                
enforce_gtid_consistency

## 重启数据库
systemctl restart mysqld
## stop slave;
   reset slave;
## 执行change master to
change master to master_auto_position=1;
## 打开
start slave;

# 检查主库从库是否都开启了gtid mode
show variables like '%gtid%';

MHA部署脚本

[root@db01 MHA]# cat install_mha.sh 
#!/bin/bash

. /etc/init.d/functions

#-------------- 变量 ------------------
check_ip="[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
mha_worker_dir=/etc/mha
mha_log_dir=/etc/mha/logs
binlog_dir=/app/mysql/data
mha_manager_user=mha
mha_manager_password=mha
repl_user=rep
repl_password=123


 ------------ 函数 -------------------
function push_public_key(){
  yum install -y sshpass &>/dev/null
  if [ ! -f ~/.ssh/id_dsa.pub ];then
    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
  fi
  for ip in $@;do
    ping -W1 -c1 $ip &>/dev/null
    if [ $? -eq 0 ];then
      sshpass -p '1' ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_dsa.pub root@$ip &>/dev/null
      action "主机:$ip" /bin/true
    else
      action "主机:$ip" /bin/false
    fi
  done
}


function check_ipaddress(){
if [[ $1 =~ $check_ip ]];then
  echo "$1 ok" &>/dev/null
else
  echo "Usage:请输入正确的IP地址。"
  exit 2
fi
}

#------------------- 程序 -----------------------

read -p "请输入集群个数:" num

expr 1 + $num &>/dev/null
if [ $? -ne 0 ];then
  echo "Usage:集群个数必须是一个整形"
  exit 1
fi

read -p "请输入master的IP地址:" master_ip
#check_ipaddress $master_ip



read -p "请输入slave的IP地址(多台使用空格开):" -a slave_ip
 check_ipaddress ${slave_ip[0]}
 push_public_key $master_ip ${slave_ip[*]}

for id in ${slave_ip[*]};do
  echo ${id##*.}
done

read -p "请输入manager的IP地址:" manager_ip
#check_ipaddress $manager_ip
if [ $manager_ip == $master_ip ];then
  echo -e  "\e[1;4;5;31mFBI Warning: 尽量不要把mha装在主库上\e[0m"
fi

cat > app1.cnf <<EOF
[server default]
manager_log=${mha_log_dir}/manager.log
manager_workdir=${mha_worker_dir}/app1
master_binlog_dir=$binlog_dir
user=$mha_manager_user
password=$mha_manager_password
ping_interval=2
repl_password=$repl_password
repl_user=$repl_user
ssh_user=root
ssh_port=22

[server100]
hostname=$master_ip
port=3306
EOF

for((n=1;n<=$num-1;n++));do
cat >> app1.cnf <<EOF
[server$n]
hostname=${slave_ip[(($n-1))]}
port=3306
EOF
done

ssh $manager_ip "mkdir -p $mha_worker_dir $mha_log_dir"
scp app1.cnf $manger_ip:$mha_worker_dir

MHA集群恢复脚本

---------#手动修复--------------

# 1.修复宕机主库
systemctl start mysqld
# 2.找到change master语句(在manager机器上找)
[root@db04 ~]# grep -i 'change master to' /etc/mha/logs/manager.log |awk -F: '{print $4}'|sed "s#xxx#123#g"
# 3.在宕机主库中执行(上一步过滤出什么,这一步执行什么)
CHANGE MASTER TO MASTER_HOST='172.16.1.52', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=154, MASTER_USER='rep', MASTER_PASSWORD='123';
# 4.开启主从复制
start slave;

# 5.修复 MHA 配置文件(被摘除的给加回来)
去装manager那台机器把挂掉的机器的IP加到server里,比如这里挂掉的是db01
 vim /etc/mha/app1.cnf 
 修复时就把
 [server1]
hostname=172.16.1.51
port=3306
加入配置文件
 
# 6.启动MHA(在manager机器上)
[root@db04 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf  --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/logs/manager.log 2>&1 &




-----------#MHA集群恢复脚本---------------------------
[root@db04 ~]# cat recovery_mha.sh

#!/bin/bash

. /etc/init.d/function

mha_log="/etc/mha/logs/manager.log"
down_master=$(sed -nr 's#^M.* (.*)\(.*\).*!$#\1#gp' ${mha_log})
pass="123"
mysql -u${mha_user} -p${mha_pass} -h$down_master -e "${change};start slave;" &>/dev/null
mha_user=mha
mha_pass=mha

# 1.修复宕机主库
ssh $down_master "systemctl start mysqld"
while true;do
	mysql_count=`ps -ef|grep -c [m]ysqld`
	if [ $mysql_count -gt 0 ];then
		action "$down_master MySQL Server" /bin/true
		change=$(grep -i 'change master to' ${mha_log} |awk -F: '{print $4}'|sed "s#xxx#$pass#g")
		break
	fi
done


# 4.修复 MHA 配置文件
cat > /etc/mha/app1.cnf <<EOF
[server default]
manager_log=${mha_log}
manager_workdir=/etc/mha/app1
master_ip_failover_script=/etc/mha/app1/master_ip_failover
master_binlog_dir=/app/mysql/data
password=${mha_user}
ping_interval=2
repl_password=123
repl_user=rep
ssh_port=22
ssh_user=root
user=${mha_pass}

[server1]
hostname=172.16.1.51
port=3306

[server2]
hostname=172.16.1.52
port=3306

[server3]
hostname=172.16.1.53
port=3306

[server4]
hostname=172.16.1.54
port=3306
EOF



--------------------------MHA恢复脚本-----------------------------------------------
[root@db04 ~]# vim recovery_mha.sh


#! /bin/bash

. /etc/init.d/functions

#-----------------定义变量------------------------

mha_log="/etc/mha/logs/manager.log"
# 找到宕机主库ip
down_master=$(sed -nr 's#^M.* (.*)\(.*\).*!$#\1#gp' ${mha_log})
# 过滤change master语句
change=$(grep -i 'change master to' ${mha_log} |awk -F: '{print $4}'|sed "s#xxx#123#g")
pass="123"
mha_user=mha
mha_pass=mha
# 启动MHA
start_mha=$(nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/logs/manager.log 2>&1 &)




#-------------调用变量修复MHA集群---------------

# 修复宕机主库,并判断是否成功启动
ssh $down_master "systemctl start mysqld"
while true;do
        mysql_count=`ps -ef|grep -c [m]ysqld`
        if [ $mysql_count -gt 0 ];then
                action "$down_master MySQL Server" /bin/true
                # 在宕机主库执行change master语句,并开启主从复制
                mysql -u${mha_user} -p${mha_pass} -h$down_master -e "${change};start slave;" &>/dev/null
                break
        fi
done

# 修复MHA配置文件(直接覆盖)
cat > /etc/mha/app1.cnf <<EOF
[server default]
manager_log=${mha_log}
manager_workdir=/etc/mha/app1
master_binlog_dir=/app/mysql/data
password=${mha_pass}
ping_interval=2
repl_password=123
repl_user=rep
ssh_port=22
ssh_user=root
user=${mha_user}

[server1]
hostname=172.16.1.51
port=3306

[server2]
hostname=172.16.1.52
port=3306

[server3]
hostname=172.16.1.53
port=3306

[server4]
hostname=172.16.1.54
port=3306
EOF


# 启动MHA
-------------------------------------还需要优化----------------

# 检测是否成功
masterha_check_status --conf=/etc/mha/app1.cnf

MHA配置VIP漂移

在云主机上不支持VIP漂移(主要原因是不能添加IP地址,不能自定义路由)

1)MHA + keepalived

缺陷:

- keepalived指定两台设备漂移,另一台必须提升为主库(candidate_master)
- 如何确定另一台BACKUP数据最新(做半同步)
  • 半同步会阻塞主库写入,影响主库性能,随时恢复到异步
  • (不对外提供服务)
  • (提升半同步复制机器的配置)

2)MHA自带VIP脚本

  • 手动将VIP绑定到主库上
ifconfig eth1:1 172.16.1.55/24
配置MHA识别master_ip_failover脚本
# 修改master_ip_failover脚本vip(脚本放在manager上)
vim /etc/mha/app1/master_ip_failover
my $vip = '172.16.1.55/24';
my $key = '1';

# 配置MHA识别master_ip_failover脚本
# 1.修改配置文件(在manager上)
vim /etc/mha/app1.cnf
[server default]
master_ip_failover_script=/etc/mha/app1/master_ip_failover

# 2.授权
chmod +x /etc/mha/app1/master_ip_failover

# 3.重启MHA
-#先停
[root@db04 ~]# masterha_stop --conf=/etc/mha/app1.cnf
Stopped app1 successfully.
-#检测主从复制
[root@db04 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
-#再启
nohup masterha_manager --conf=/etc/mha/app1.cnf  --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/logs/manager.log 2>&1 &
	-# 重启后检测是否成功
	[root@db04 ~]# masterha_check_status --conf=/etc/mha/app1.cnf


# 4。手动将vip绑定到主库上(测试时主库在db02上)(绑定时要和脚本保持一致)
[root@db02 ~]# ifconfig eth1:1 172.16.1.55/24
	-# 查看是否绑定成功
	[root@db02 ~]# ifconfig 
	eth1:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
	        inet 172.16.1.55  netmask 255.255.255.0  broadcast 	172.16.1.255
  	    ether 00:0c:29:83:a5:08  txqueuelen 1000  (Ethernet)


## 导致MHA起不来(启动过错中的报错)
1)脚本不在指定目录
2)没有执行权限
3)格式有问题127:0
转换格式:dos2unix /etc/mha/app1/master_ip_failover

解决binlog因为断电断网无法保存

## 解决binlog因为断电断网无法保存
binlog Server
```bash
## binlog server是MySQL集群内的某一台机器
[server1]
hostname=172.16.1.51
port=3306

[server2]
hostname=172.16.1.52
port=3306

[server3]
hostname=172.16.1.53
port=3306

[server4]
hostname=172.16.1.54
port=3306

[binlog1]
no_master=1
master_binlog_dir=/data/mysql/binlog
hostname=172.16.1.54


## binlog server是MySQL集群外的某一台机器
[server1]
hostname=172.16.1.51
port=3306

[server2]
hostname=172.16.1.52
port=3306

[server3]
hostname=172.16.1.53
port=3306

[server4]
hostname=172.16.1.54
port=3306

[binlog1]
master_binlog_dir=/data/mysql/binlog
hostname=172.16.1.58


## 创建binlog存放目录
mkdir -p /data/mysql/binlog


[root@db04 binlog]# mysqlbinlog  -R --host=172.16.1.55 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &
```


1)sersync + rsync
问题:MHA怎么知道,你binlog在哪?
```bash
[binlog1]
master_binlog_dir=/data/mysql/binlog
hostname=172.16.1.54
```

2)mysqlbinlog
    - 查看binlog   --base64-output=decode-rows
    - 截取binlog   --start-position --stop-position
    - 同步binlog

1)sersync + rsync 问题:MHA怎么知道,你binlog在哪?

[binlog1]
master_binlog_dir=/data/mysql/binlog
hostname=172.16.1.54

2)mysqlbinlog \- 查看binlog --base64-output=decode-rows

\- 截取binlog --start-position --stop-position \- 同步binlog

MySQL读写分离

- mysql-proxy Lua
- atlas 360:C Alibaba:Java
- mycat

Atlas主要功能

1.读写分离 2.从库负载均衡 3.IP过滤 4.自动分表(不用) 5.DBA可平滑上下线DB 6.自动摘除宕机的DB

分表功能

垂直拆分 水平拆分

Atlas相对于官方MySQL-Proxy的优势

1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口 2.重写网络模型、线程模型 3.实现了真正意义上的连接池 4.优化了锁机制,性能提高数十倍

Atlas安装

[root@db01 ~]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
## 修改配置文件
[root@db01 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
## 管理接口
#管理接口的用户名
admin-username = user
#管理接口的密码
admin-password = pwd
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345


[root@db01 conf]# cat /usr/local/mysql-proxy/conf/lol.cnf
[mysql-proxy]
#带#号的为非必需的配置项目
#管理接口的用户名
admin-username = user
#管理接口的密码
admin-password = pwd
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 172.16.1.55:3306
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,
可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 172.16.1.52:3306,172.16.1.53:3306,172.16.1.54:3306
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的
user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = rep:3yb5jEku5h4=, mha:O2jBXONX098=
#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为
false,线上运行时设为true,true后面不能有空格。
daemon = true
#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor
在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为
false,线上运行时设为true,true后面不能有空格。
keepalive = true
#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置,CPU核心数
event-threads = 8
#日志级别,分为message、warning、critical、error、debug五个级别
log-level = error
#日志存放的路径
log-path = /usr/local/mysql-proxy/log
#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,
REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
sql-log = ON
#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记
录。不设置该参数则输出全部日志。
sql-log-slow = 10
#实例名称,用于同一台机器上多个Atlas实例间的区分
instance = test
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:3307
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分
隔,若不分表则不需要设置该项
#tables = world.city.countycode.5
#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
charset = utf8
#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有
IP连接,否则只允许列表中的IP连接
client-ips = 127.0.0.1
#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,
否则可以不设置
#lvs-ips = 192.168.1.1

[root@db01 conf]# /usr/local/mysql-proxy/bin/mysql-proxyd lol start
OK: MySQL-Proxy of lol is started


Atlas管理接口使用

## 管理接口
#管理接口的用户名
admin-username = user
#管理接口的密码
admin-password = pwd
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345


[root@db01 ~]# mysql -uuser -ppwd -h127.0.0.1 -P2345
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论