官网: https://www.haproxy.com/
自由及开放源代码软件
HAPrOxy是一个使用C语言编写的自由及开旅酒代码软性,其提供高可用性、负我均衡,以及基于TCP和HTTP的应用程座代理
HAProxy特别适用于那些负载特大的webi些站点通常又需要会话保挂或七层处理。HAPOxy运行在当动的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全地整合进用户当前的架构中,同时可以保护用户的web服务器不被幂露到网络上。HAPTOXy实现了一种事件驱动,单一进程横型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件聚动模型因为在有更好的资源和时间管理的用户空间(User-Space)实现所有这些任务,所以没有这些问题,此模型的辩端是,在多核系统上,这些程序通常扩展性较差,这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
包括 GiHu.Bilbuckelf3]. stack overiew[4].Twiller6和 Tuem7]在内的知名网站,及亚马逊网络服务系统都使用了UUIHAPrOXY.
一、haproxy安装及配置
1、安装
[root@HAproxy ~]# yum -y install ntpdate.x86_64
[root@HAproxy ~]# yum -y install ntp
[root@HAproxy ~]# ntpdate cn.ntp.org.cn
13 Aug 19:39:27 ntpdate[1955]: adjust time server 120.197.116.202 offset 0.059032 sec
[root@HAproxy ~]# systemctl start ntpd
[root@HAproxy ~]# systemctl enable ntpd
[root@HAproxy ~]# yum -y install haproxy
2、配置
[root@HAproxy ~]# vim /etc/haproxy/haproxy.cfg
43 mode http
63 frontend main *:80
67 # use_backend static if url_static
#67行注释掉
68 default_backend web
#最后一行加以下内容
86 backend web
87 balance roundrobin
88 server web1 192.168.1.11:80 check
89 server web2 192.168.1.12:80 check
3、重启服务并测试
[root@HAproxy ~]# systemctl start haproxy
[root@HAproxy ~]# systemctl enable haproxy
[root@HAproxy ~]# curl 192.168.1.15
web-01
[root@HAproxy ~]# curl 192.168.1.15
web-02
[root@HAproxy ~]# curl 192.168.1.15
web-01
[root@HAproxy ~]# curl 192.168.1.15
web-02
4、添加统计页面
[root@HAproxy ~]# vim /etc/haproxy/haproxy.cfg
91 # 定义web管理界面
92 listen statistics
93 bind *:9090 #定义监听端口
94 mode http #默认使用协议
95 stats enable #启用stats
96 stats uri /hadmin?stats #自定义统计页面的url
97 stats auth admin:admin #统计页面的账号密码
98 stats hide-version #隐藏在统计页面上的haproxy版本信
99 stats refresh 30s #统计页面自动刷新时间
100 stats admin if TRUE #如果认证通过就做管理功能,可以管理后端服务器
101 stats realm hapadmin #统计页面密码框上提示文件,默认为haproxy\statisti cs
[root@HAproxy ~]# systemctl restart haproxy
浏览器访问(192.168.1.15:9090/hadmin?stats)
扩展:加权轮询
[root@HAproxy ~]# vim /etc/haproxy/haproxy.cfg #只修改以下这一部分
backend web
balance static-rr
server web1 192.168.1.11:80 weight 8 check
server web2 192.168.1.12:80 weight 2 check
[root@HAproxy ~]# systemctl restart haproxy
二、使用haproxy对mysql进行负载均衡
1、安装
[root@HAproxy ~]# yum -y install ntpdate.x86_64
[root@HAproxy ~]# yum -y install ntp
[root@HAproxy ~]# ntpdate cn.ntp.org.cn
13 Aug 19:39:27 ntpdate[1955]: adjust time server 120.197.116.202 offset 0.059032 sec
[root@HAproxy ~]# systemctl start ntpd
[root@HAproxy ~]# systemctl enable ntpd
[root@HAproxy ~]# yum -y install haproxy
2、配置
[root@HAproxy ~]# vim /etc/haproxy/haproxy.cfg
43 mode tcp
63 frontend main *:80
67 # use_backend static if url_static
#67行注释掉
68 default_backend mysql
#最后一行加以下内容
86 backend mysql
87 balance roundrobin
88 server mysql1 192.168.1.21:3306 check
89 server mysql2 192.168.1.22:3310 check
4、添加统计页面
[root@HAproxy ~]# vim /etc/haproxy/haproxy.cfg
91 # 定义web管理界面
92 listen statistics
93 bind *:9090 #定义监听端口
94 mode http #默认使用协议
95 stats enable #启用stats
96 stats uri /hadmin?stats #自定义统计页面的url
97 stats auth admin:admin #统计页面的账号密码
98 stats hide-version #隐藏在统计页面上的haproxy版本信
99 stats refresh 30s #统计页面自动刷新时间
100 stats admin if TRUE #如果认证通过就做管理功能,可以管理后端服务器
101 stats realm hapadmin #统计页面密码框上提示文件,默认为haproxy\statisti cs
[root@HAproxy ~]# systemctl restart haproxy
4、重启服务并测试
[root@HAproxy ~]# systemctl start haproxy
[root@HAproxy ~]# systemctl enable haproxy
三、mysql读写分离
(1)在生产中,查询和修改的比例大概为7:3,查询压力大,可以分出多的主机做查询,slave也是可以被查询,所以可以将mysql做成高可用主从复制
(2)用户发送请求服务器响应压力,(nginx,lvs,haproxy)但是web服务器要提供服务,需要从数据库中读写数据,随着业务量并发量的提高,单点mysql已经无法满足需求,所以需要配置1主1从。一主多从
(3)对数据库的从服务器不允许修改,否则M-S失效
(4)读写分离
(5)代码级别读写分离,中间件读写分析
四、python代码的读写分离
1、安装pymysql是python管理mysql的驱动,或者成为连接器
pip3 install pymysql
2、在python3的命令行界面引入pymysql
import pymysql
3、创建两个connection对象,一个指向master-mysql,一个指向slave-mysql
>>>master_conn=pymysql.connect(host="192.168.1.21",user="xiaojiang",password="Zhang@2002",database="test",port=3306)
>>>slave_conn=pymysql.connect(host="192.168.1.22",user="xiaojiang",password="Zhang@2002",database="test",port=3310)
4、获取数据游标master
master_cursor=master_conn.cursor()
5、执行查询maser
select——sql="select * from user";
master_cursor.execute(select_sql);
rs=cyrsor.fetchall()
6、执行修改master
updatesql="update user set password='000' where username='aaa'"
master_cursor.execute(updatesql)
master_conn.commit()
7、执行删除master
delete_sql="delete from user where username='aaa'"
master_cursor.execute(delete_sql)
master_conn.commit()
8、执行新增master
insert_sql="insert into user values (1004.'dddddd','ddddddd')"
master_cursor.execute(insert_sql);
master_conn.commit()
9、执行查询slave
>>> #执行查询获得获得slave游标
>>> slave_cursor=slave_conn. cursor()
>>>sql
'select * from user'
>>>slave_cursor.execute(sql)
3
>>>slave_cursor.fetchall()
((2,'bbb', 'bbbb'),(3, 'ccc', 'cccc'),(1004,'ddddd', 'ddddddd ' ))
class rwsplit(object):
def __init__ (self):
print("initialized")
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)