linux-keepalived-05 keepalived+HAProxy+Mysql(双主)部署
环境准备
node1(HAProxy1+keepalived主):192.168.141.53
node2(HAProxy2+keepalived从):192.168.141.69
node3(Mysql1主):192.168.141.12
node4(Mysql2主):192.168.141.132
VIP:192.168.10.100
Mysql部署(双主)
1、部署数据库
1 | node3: |
2、初始化数据库,初始密码为空,直接回车即可。然后设置数据库root密码为123456,之后一路敲y回车即可。node3如下:
1 | [root@node3 ~]# mysql_secure_installation |
node4如下:
1 | [root@node4 ~]# mysql_secure_installation |
1 | [root@node3 ~]# mysql -u root -p |
注意:master_user=’repuser’,master_password=’000000’设置的用户名密码,
master_log_file=’mysql-bin.000003’,master_log_pos=1721中的值对应的是上面的File和Position的值。
HAProxy部署
在node1和node2上执行以下脚本:
1 | [root@node1 ~]# vim node1_haproxy.sh |
注意:bind 0.0.0.0:8080指的是8080端口
stats auth admin:admin表示haproxy的用户名密码均为admin
测试haproxy的可用性,分别打开node1和node2的ip即可。
Keepalived部署
这个脚本建立在node1上即可,node2不需要。
1 | [root@node1 ~]# vim /usr/local/src/check_proxy_pid.sh |
1 | node1上执行脚本: |
测试
测试vip的可用性,访问http://192.168.141.100:8080/dbs
用户名密码均为admin,如下可以看到vip是可用的。
检测keepalived的vip是否可以正常漂移
首先记住要关闭node1和node2的防火墙!
1 | [root@node1 ~]# systemctl stop firewalld |
node1
1 | [root@node1 ~]# ip add |
node2
1 | [root@node2 ~]# ip add |
停止node1的Keepalived服务,观察VIP是否漂移,访问正常
1 | [root@node1 ~]# systemctl stop keepalived |
可以看到vip现在已经转移到了node2上面
1 | [root@node2 ~]# ip add |
测试漂移后的vip的可用性
由于keepalived主设备的选举默认是抢占模式的,所以我们重启node1的keepalived之后,vip能够重新自node2上面漂移回到node1上面。
1 | [root@node1 ~]# systemctl restart keepalived |
可以看到vip已经漂移回到node1上了
1 | [root@node2 ~]# ip add |
停止node1节点上的HAProxy服务,观察VIP是否漂移,vip是否还能正常访问
1 | [root@node1 ~]# systemctl stop haproxy |
可以看到vip正常漂移到了node2上面,而且vip仍然可以正常访问
然后重启node1节点上的HAProxy服务,观察VIP是否漂移回来,vip是否还能正常访问
1 | [root@node1 ~]# systemctl restart haproxy |
可以看到vip漂移回到了node1上面,而且vip仍然可以正常访问。
现在开始检测haproxy对后端两台mysql服务器的监控
1)关闭node3和node4的mariadb
1 | [root@node3 ~]# systemctl stop mariadb |
2)查看监控,可以看到监控那两行均变为红色,意思是挂了
3)开启node3的mariadb服务
1 | [root@node3 ~]# systemctl restart mariadb |
再看监控界面,可以看到mysqldb1那一行变成了绿色
同理,将node4的mariadb服务也开启一下
1 | [root@node4 ~]# systemctl restart mariadb |
再看监控界面,可以看到mysqldb2那一行也变成了绿色
因此,当node3或者node4的mariadb服务发生异常的时候,我们可以通过监控界面及时发现。
接下来进行mysql远程连接测试
1)先在360软件管家下载一个navicat
2)可以看到它的有效期是14天,很鸡肋,这是百度经验上如何激活navicat的教程,亲测有效!
https://jingyan.baidu.com/article/495ba841b239e638b20ede4a.html
3)先在node3上的mysql里创建test用户
1 | [root@node3 ~]# mysql -u root -p |
4)授权允许任意远程主机以test的身份连接node3的数据库
1 | [root@node3 ~]# mysql -u root -p |
5)再使用远程主机连接192.168.141.12的3306端口,这里我们的windows对于node3就算是远程主机了。如下图,可以看到连接是成功的
然后测试远程主机连接192.168.141.100的3306端口,可以发现被拒了,是不是很难受?分析一下,可以发现拒绝我们的并非是node3,而是当前vip所在主机也就是node1。
我们之前已经关闭了node1的防火墙和selinux,可以通过vip正常访问haproxy监控页面,可以正常连接node3的数据库,然而通过远程连接vip的3306端口来连接后端数据库居然是被拒绝的,为什么?
因为,在这种服务体系架构中,一旦别人可以通过远程连接vip的3306端口来连接后端数据库,那还了得?那还有什么安全性可言呢?
例如现在咱们在node3后node4上面都搭建了一个wordpress博客,博客所用数据库就放在node3和node4上面。我们的node1和node2通过反向代理,让别人通过访问node1和node2来访问后端的node3和node4上面的wordpress博客,可以避免我们的后端数据库直接暴露在访问者的面前。现在我们实现了高可用,别人访问我们的wordpress博客,看到的只是vip:192.168.141.100,他们不会知道后端node3和node4的具体存在,这让我们得以保护好弄得3和node4上面的数据库,然后又不妨碍我们内部人员知道node3和node4这些后端具体服务器ip的人去连接数据库。
所以,远程主机连接192.168.141.100的3306端口被拒绝是正常的,这是我们对后端数据库的保护措施。
接下来,重新使用远程主机连接node3也就是192.168.141.12的3306端口,可以看到连接成功。
现在关闭node3上的mariadb服务,再次查看连接可以看到连接失败。
1 | [root@node3 ~]# systemctl stop mariadb |
现在重启node3上的mariadb服务,再次查看连接可以看到连接成功。
1 | [root@node3 ~]# systemctl restart mariadb |
还记得我们初始化数据库时设置的root密码吗?往上翻翻可以看到是123456。接下来我们使用root用户来连接一下node3的数据库,可以看到连接失败。
现在我们要让root用户也可以连接node3的数据库。
1 | [root@node3 ~]# mysql -u root -p |
再次使用root用户来连接一下node3的数据库,则可以看到连接成功。