mysql集群

发布于:2025-05-17 ⋅ 阅读:(13) ⋅ 点赞:(0)

mysql双主+keepalived+haproxy
一、集群作用
实现高可用及负载均衡。
 

二、示例

1.实验环境
101 mysql01

102 mysql01

103 haproxy01+keepalived01

104 haproxy02+keepalived02

105 client

2.各主机改名并关闭防火墙
101 mysql01

102 mysql02

103 haproxy01

104 haproxy02

105 client

systemctl stop firewalld

setenforce 0

3.101,102安装mysql8.0(二进制编码包安装,解压即用)
tar zxf mysql-8.0.33-linux-glibc2.28-x86_64.tar -C /usr/local/ # 解压mysql到/usr/local
cd /usr/local	# 切换到/usr/local下
mv mysql-8.0.33-linux-glibc2.28-x86_64 mysql # 重命名文件为mysql
useradd mysql		# 创建运行用户mysql
cd /usr/local/mysql/bin	# 切换到mysql的bin下
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ # 初始化,指定软件目录和数据目录,会生成随机密码。

vim /etc/my.cnf		# 编写mysql主配置文件
[mysqld]
basedir=/usr/local/mysql/	# 软件目录
datadir=/usr/local/mysql/data/	# 数据目录

ln -s /usr/local/mysql/bin/* /usr/local/bin/	# 优化系统路径,做软连接(也可写变量)
cd /usr/local/mysql/support-files/	 # 切换到mysql的支持文件
cp mysql.server /etc/init.d/mysqld	 # 复制启动脚本到系统服务,命名为  mysqld

vim /etc/init.d/mysqld			 # 编写启动脚本
basedir=/usr/local/mysql/	         # 增加内容
datadir=/usr/local/mysql/data/		 # 增加内容

chmod +x /etc/init.d/mysqld		 # 授予执行权限
chkconfig --add mysqld			 # 将mysqld添加到系统服务
service mysqld start			 # 启动mysql

mysql -uroot -p临时密码			 # 输入临时密码登录

# 修改root密码
mysql>alter user 'root'@'localhost' identified by 'pwd123'; 

# 创建用户张三,%代表所有允许连接的主机,密码为pwd123
mysql>create user 'zhangsan'@'%' identified by 'pwd123';

# 将用户zhangsan的身份验证方式强制设置为mysql_native_password并更新密码为pwd123
mysql> alter user 'zhangsan'@'%' identified with mysql_native_password by 'pwd123';

# 授予zhangsan用户在所有数据库中所有表上的全部权限。
mysql> grant all privileges on *.* to 'zhangsan'@'%';

# 刷新权限。
mysql> flush privileges;

101 vim /etc/my.cnf
[mysqld]		# 配置文件主部分,表示mysql数据库的服务配置
basedir=/usr/local/mysql/	# 软件目录
datadir=/usr/local/mysql/data/	# 数据目录
log-bin=mysql-bin	# 启用日志记录功能
server-id=1		# mysql实例的唯一id
log-slave-updates=true	# 开启后,将从服务器的更新日志记录到主服务器的日志文件中。

102 vim /etc/my.cnf
[mysqld]		# 配置文件主部分,表示mysql数据库的服务配置
basedir=/usr/local/mysql/	# 软件目录
datadir=/usr/local/mysql/data/	# 数据目录
log-bin=mysql-bin	# 启用日志记录功能
server-id=2		# mysql实例的唯一id
log-slave-updates=true  # 开启后,将从服务器的更新日志记录到主服务器的日志文件中。

mysql>show master status;	# 查看binray log文件名和位置
 change master to    master_host='192.168.10.102',master_user='zhangsan',master_password='pwd123',master_log_file='mysql-bin.000001',master_log_pos=155;
# 连接主,指定主的IP地址,主上已授权的用户及密码,主上的日志文件名及位置。
101和102互联,使用的用户为前面创建的用户zhangsan
mysql>show slave status\G # 查看主从同步状态,io线程和sql线程都为yes即成功。
#####################至此,mysql双主完成#######################################

4.103、104安装haproxy,代理mysql服务,保护真实服务器地址。
yum -y install pcre-devel bzip2-devel gcc*	# 安装haproxy的依赖包
tar zxf  haproxy-1.5.19.tar.gz			# 解压haproxy
cd haproxy-1.5.19/				# 进入haproxy
make TARGET=linux26				# 编译,使用uname -r可查看内核版本 使用more readme 可查看到内核版本对应的TARGET= 
make install					# 编译安装 
mkidr /etc/haproxy				# 创建haproxy配置文件目录
cp examples/haproxy.cfg /etc/haproxy/		# 复制配置文件
mkdir /usr/share/haproxy			
vim /etc/haproxy/haproxy.cfg			# 修改配置文件(无用的配置文件必须删除,否则haproxy会一个一个进行校对,这样就会导致启动失败)

global
	log 127.0.0.1	local0
	log 127.0.0.1	local1 notice		# 日志级别为notice
	#log loghost	local0 info
	maxconn 4096
#	chroot /usr/share/haproxy		# haproxy的根目录,不注释启动会失败
	uid 99					# 运行haproxy的用户
	gid 99					# 运行haproxy的组
	daemon					# 启动后以后台方式运行
	#debug
	#quiet

defaults
	log	global
	mode	tcp				# 模式为tcp
	option	httplog
	option	dontlognull
	retries	3
	redispatch
	maxconn	2000				# 最大连接
	contimeout	5000			# 成功连接到一台服务器的最长等待时间 默认单位:毫秒
	clitimeout	50000			# 连接客户端发送数据时最长等待时间 默认单位:毫秒
	srvtimeout	50000			# 服务器端回应客户端数据发送的最长等待时间 默认单位毫秒

frontend  main *:3306                 		# 这里为实验方便,用3306端口
    default_backend             mysql 		# 后端服务器组名 

backend mysql
    balance     leastconn              		# 使用最少连接方式调度
    server m1 192.168.10.101:3306 check port 3306 maxconn 300 
    server m2 192.168.10.102:3306 check port 3306 maxconn 300 # 指定mysql服务器ip及端口,最大连接数为300

cp examples/haproxy.init /etc/init.d/haproxy	# 复制进程文件到/etc/init.d
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy	# 软连接方式做环境变量
chmod +x /etc/init.d/haproxy			# 给haproxy.init执行权限
/etc/init.d/haproxy start			# 启动haproxy
Reloading systemd:                                         [  确定  ]
Starting haproxy (via systemctl):                          [  确定  ]
# 成功启动显示的内容
service haproxy start 				# 启动haproxy
netstat -tnlp | grep haproxy			# 查看状态
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      60805/haproxy       
tcp        0      0 0.0.0.0:6677            0.0.0.0:*               LISTEN      60805/haproxy 					# 状态信息

101上创建测试用的账户并授权,因为101和102互为主从,所以在一台上敲即可。

# 创建用户李四,%代表所有允许连接的主机,密码为pwd123
mysql>create user 'lisi'@'%' identified by 'pwd123';

# 将用户lisi的身份验证方式强制设置为mysql_native_password并更新密码为pwd123
mysql> alter user 'zhangsan'@'%' identified with mysql_native_password by 'pwd123';

# 授予lisi用户在所有数据库中所有表上的全部权限。
mysql> grant all privileges on *.* to 'zhangsan'@'%';
客户端访问
mysql -ulisi -p123456 -h192.168.10.103		# 访问测试
mysql -ulisi -p123456 -h192.168.10.104 		# 访问测试
mysql>						# 访问成功会登入mysql
#####################proxy完成!!!#######################################

5.103、104安装keepalived,实现高可用。
systemctl stop NetworkManager			# 关闭网络管理功能,防止干扰实验
yum -y install keepalived ipvsadm		# 安装keepalived和ipvsadm
systemctl enable keepalived			# 设置开机自启动

vim /etc/keepalived/keepalived.conf		# 配置keepalived,Vrrp_strict 此项必须注释掉,否则严格遵守vrrp协议,会导致无法访问vip。
103上配置文件内容
global_defs {                                                
notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_01
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/chk.sh"                      ##检查haproxy的脚本
    interval 2                                           ##每两秒检查一次
}

vrrp_instance VI_1 {
    state BACKUP                                        ##定义为BACKUP节点
    nopreempt                                           ##开启不抢占
    interface ens160
    virtual_router_id 51
    priority 100                  ##开启了不抢占,所以此处优先级必须高于另一台
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100                                 ##配置VIP
    }
    track_script {
        chk_haproxy                                    ##调用检查脚本
    }

    notify_backup "/etc/init.d/haproxy restart"
    notify_fault "/etc/init.d/haproxy stop"
}

104上配置文件内容
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_02
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/chk.sh"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100
    }
    track_script {
        chk_haproxy
    }

    notify_backup "/etc/init.d/haproxy restart"
    notify_fault "/etc/init.d/haproxy stop"
}

vim /etc/keepalived/chk.sh				# 创建脚本
#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
       systemctl restart keepalived
fi

chmod +x /etc/keepalived/chk.sh				# 给予权限
service keepalived start 				# 开启keepalived

ip add							# 查看vip
 inet 192.168.10.103/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.100/32 scope global ens160
##因为两台主机均配置为BACKUP,因此哪台先运行keepalived,VIP就在哪台上,此时在103上。
mysql -ulisi -p123456 -h192.168.10.100			# 连接测试,会登入mysql。
CREATE DATABASE ooos;					# 101、102都可以看到
| Database           |
+--------------------+
| information_schema |
| mysql              |
| ooos               |
| performance_schema |
| test               |					# 101、102显示结果

关闭103的haproxy,keepalived会随脚本自动关闭,此时104拿着vip,检测mysql的连接,发现没有中断。


网站公告

今日签到

点亮在社区的每一天
去签到