1、练习
[root@nat ~]# ipvsadm -d -t 192.168.10.101:3306 -r 10.0.0.22:3306 #删除真实主机
nat:
[root@nat ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.10 netmask 255.255.255.0 broadcast 10.0.0.255
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.101 netmask 255.255.255.0 broadcast 192.168.10.255
[root@nat ~]# yum -y install ipvsadm.x86_64
[root@nat ~]# ipvsadm -A -t 192.168.10.101:3306 -s rr
[root@nat ~]# ipvsadm -a -t 192.168.10.101:3306 -r 10.0.0.21:3306 -m
[root@nat ~]# ipvsadm -a -t 192.168.10.101:3306 -r 10.0.0.22:3306 -m
[root@nat ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:3306 rr
-> 10.0.0.21:3306 Masq 1 0 0
-> 10.0.0.22:3306 Masq 1 0 0
[root@nat ~]# vim /etc/sysctl.conf
[root@nat ~]# net.ipv4.ip_forward=1
sysctl -p
mysql:
[root@master-mysql ~]# route del default
[root@master-mysql ~]# route add default gw 10.0.0.10
[root@mysql-slave ~]# route del default
[root@mysql-slave ~]# route add default gw 10.0.0.10
2、同步时间
[root@haproxy ~]# yum -y install ntpdate.x86_64
[root@haproxy ~]# ntpdate cn.ntp.org.cn
14 Aug 15:48:21 ntpdate[1858]: adjust time server 203.107.6.88 offset -0.000690 sec
[root@haproxy ~]# date
2024年 08月 14日 星期三 15:48:30 CST
[root@haproxy ~]# yum -y install ntp.x86_64
[root@haproxy ~]# vim /etc/ntp.conf
15行加入 restrict 10.0.0.0 mask 255.255.255.0 #允许10.0.0.0网段的主机访问
[root@haproxy ~]# systemctl start ntpd
[root@web01 ~]# yum -y install ntpdate.x86_64
[root@web01 ~]# ntpdate 10.0.0.35
14 Aug 15:58:19 ntpdate[1654]: adjust time server 10.0.0.35 offset -0.003274 sec
[root@web02 ~]# yum -y install ntpdate.x86_64
[root@web02 ~]# ntpdate 10.0.0.35
14 Aug 15:58:19 ntpdate[1654]: adjust time server 10.0.0.35 offset -0.003274 sec
3、web haproxy高可用代理
(1)打开web01和web02
[root@web01 ~]#nginx
[root@web02 ~]#nginx
(2)下载安装haproxy
[root@haproxy ~]# yum -y install haproxy
[root@haproxy ~]# rpm -ql haproxy
(3)编辑haproxy配置文件,实现代理负载均衡
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
43行 http #表示代理http服务
63行 5000改80 #将端口号5000改为80
#67行 use_backend #没有配置静态服务器,直接注释
68行 app换web #将默认app模块改为web
87行 backend web #编写web模块
balance roundrobin
server weba 10.1.1.200:80 check
server webb 10.1.1.201:80 check
[root@haproxy ~]# systemctl status haproxy
[root@haproxy ~]# systemctl start haproxy
[root@haproxy ~]# systemctl enable haproxy
[root@haproxy ~]# curl 10.1.1.30
web01
[root@haproxy ~]# curl 10.1.1.30
web02
(4)编辑haproxy配置文件,添加统计页面
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
# 配置文件最后追加
listen statistics
bind *:9090 #定义监听端口
mode http #默认使用协议
stats enable #启用stats
stats uri /hadmin?stats #自定义统计页面的url
stats auth admin:admin #统计页面的账号密码
stats hide-version #隐藏在统计页面上的haproxy版本信息
stats refresh 30s #统计页面自动刷新时间
stats admin if TRUE #如果认证通过就做管理功能,可以管理后端服务器
stats realm hapadmin #统计页面密码框上提示文件,默认为haproxy\statistic
[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# netstat -lntup | grep haproxy
tcp 0 0 0.0.0.0:9090 0.0.0.0:* LISTEN 1665/haproxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1665/haproxy
udp 0 0 0.0.0.0:37365 0.0.0.0:* 1664/haproxy
5)编辑haproxy配置文件,添加权重功能
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
backend web
balance static-rr
server web01 10.0.0.11:80 weight 3 check
server web02 10.0.0.12:80 weight 1 check
[root@haproxy ~]# systemctl restart haproxy
4、mysql haproxy高可用代理
(1)打开数据库
[root@master-mysql ~]# service mysql8 start
[root@mysql-slave ~]# service mysql8 start
(2)编辑haproxy配置文件,实现代理负载均衡
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
43行 mode tcp
67行# use_backend static if url_static
68行 default_backend mysql
86行 backend mysql
balance static-rr
server mysql01 10.0.0.21:3306 weight 3 check
server mysql02 10.0.0.22:3306 weight 1 check
[root@haproxy ~]# systemctl restart haproxy
[root@haproxy ~]# netstat -lntup | grep haproxy
tcp 0 0 0.0.0.0:9090 0.0.0.0:* LISTEN 2045/haproxy
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2045/haproxy
udp 0 0 0.0.0.0:54557 0.0.0.0:* 2044/haproxy
[root@mysql-slave ~]# mysql -u10.0.0.35 -p'123'
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 10 |
+---------------+-------+
1 row in set (0.09 sec)
[root@mysql-slave ~]# mysql -u10.0.0.35 -p'123'
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 11 |
+---------------+-------+
1 row in set (0.09 sec)
mysql> help change master to #查看连接master的帮助信息
1、python代码实现mysql的读写分离
(1)安装pymysql是python管理mysql的驱动,或者成为连接器
[root@python ~]# pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
[root@python ~]# pip3 install pymysql #安装pymysql
(2)在python3的命令行界面引入pymysql
[root@python ~]# mysql3
>>> import pymysql
(3)创建两个connenction对象,一个指向master mysql,一个指向slave mysql
master_conn=pymysql.connect(host="10.0.0.21",user="li",port=3306,database="test",password="li")
slave_conn=pymysql.connect(host="10.0.0.22",user="li",port=3306,database="test",password="li")
(4)获取数据游标
>>> master_cursor=master_conn.cursor()
(5)执行查询
>>> select_sql="select * from student"
>>> master_cursor.execute(select_sql)
3
>>> master_cursor.fetchall()
((1001, '孙颖莎', '云计算2班', '1002'), (1002, '大头', '云计算2班', '1003'), (1003, '小胖', '云计算2班', '1004'))
(6)执行修改
>>> update_sql="update student set name='马龙' where id=1002" >>> master_cursor.execute(update_sql) 1 >>> master_conn.commit()
(7)执行删除
>>> delete_sql="delete from student where name='小胖'" >>> master_cursor.execute(delete_sql); 1 >>> master_conn.commit()
(8)执行新增
>>> insert_sql="insert into student values(1004,'张翔','云计算2班','1004')"
>>> master_cursor.execute(insert_sql)
1
>>> master_conn.commit()
(9)执行查询(slave)
>>> slave_cursor=slave_conn.cursor()
>>> sql="select * from student"
>>> slave_cursor.execute(sql)
3
>>> slave_cursor.fetchall()
((1001, '孙颖莎', '云计算2班', '1002'), (1002, '马龙', '云计算2班', '1003'), (1004, '张翔', '云计算2班', '1004'))
2、python脚本实现mysql的读写分离
[root@python ~]# vim rwpython.py
class rwsplit(object):
def __init__ (self):
print("initialize")
def master_statment(self,sql):
pass
def slave_statment(self,sql):
pass
if __name__ == "__main__":
demo=rwsplit()
sql=input("sign sql:")
if sql[:6]=="select":
demo.slave_statment(sql)
else:
demo.master_statment(sql)