MySQL读写分离之负载均衡

时间:2022-09-23 20:33:12
mysql官方文档中有这么一句话: MySQL Proxy is currently an Alpha release and should not be used within production environments.So。。。   使用haproxy来做这些事,以下仅供参考: 环境配置 master        192.168.1.106             master1 slave1         192.168.1.107             master2<--->master1(与master1主-主复制) slave2         192.168.1.110             slave2---->master1(master1的从库) slave3         192.168.1.111             slave3---->master1(master1的从库) slave4         192.168.1.112             slave4----> master2(master2的从库)   monitor     192.168.1.200                    192.168.1.105   eth1 写ip                    192.168.1.113   eth2 读ip     说明: 当 master 停止复制, slave1 成为主库,haproxy停止发送请求到master和slave2,slave3, slave1与slave2,slave3依然可以从master接收日志。当slave1停止复制,master成为主库,haproxy停止发送请求到slave1和slave4,master与slave4依然可以从slave1接收日志。当 master和slave1同时停止复制,这时2台主库变成readonly模式,数据库不能写入 ,haproxy停止发送请求到slave2,slave3,slave4(脑裂)。当slave1 offline时,master进入backup mode,haproxy停止发送请求到slave1,slave4。当master offline时,slave1进入backup mode,haproxy停止发送请求到master,slave2,slave3。当master和slave1同时offline,整个DB停止工作。   1、主从配置(略)   2、安装  xinetd ,配置mysqlchk服务 vi /etc/xinetd.d/mysqlchk
  
 
 
  1. --两个master配置
  2. service mysqlchk-write 
  3.  flags           = REUSE 
  4.  socket_type     = stream 
  5.  port            = 9201 
  6.  wait            = no 
  7.  user            = root 
  8.  server          = /opt/script/mysqlchk_status.sh 
  9.  log_on_failure  += USERID 
  10.  disable         = no 
  11.  only_from       = 192.168.1.0/24  #recommended to put the IPs that need 
  12.                                   # to connect exclusively (security purposes) 
  13.  per_source      = UNLIMITED 
  14.  
  15. service mysqlchk-read 
  16.  flags           = REUSE 
  17.  socket_type     = stream 
  18.  port            = 9202 
  19.  wait            = no 
  20.  user            = root 
  21.  server          = /opt/script/mysqlchk_replication.sh 
  22.  log_on_failure  += USERID 
  23.  disable         = no 
  24.  only_from       = 192.168.1.0/24  #recommended to put the IPs that need 
  25.                                   # to connect exclusively (security purposes) 
  26.  per_source      = UNLIMITED 
  27.  
  28. --所有slaves只需配置复制状态检查脚本 
  29. service mysqlchk-read 
  30.  flags           = REUSE 
  31.  socket_type     = stream 
  32.  port            = 9202 
  33.  wait            = no 
  34.  user            = root 
  35.  server          = /opt/script/mysqlchk_replication.sh 
  36.  log_on_failure  += USERID 
  37.  disable         = no 
  38.  only_from       = 192.168.1.0/24  #recommended to put the IPs that need 
  39.                                   # to connect exclusively (security purposes) 
  40.  per_source      = UNLIMITED 
  vi /etc/services
  
 
 
  1. --两个master添加: 
  2. mysqlchk-write    9201/tcp         # MySQL status check 
  3. mysqlchk-read   9202/tcp         # MySQL replication check 
  4.  
  5. --所有slaves添加: 
  6. mysqlchk-read   9202/tcp         # MySQL replication check 
  重启 xinetd
  
 
 
  1. # /etc/init.d/xinetd stop 
  2. # /etc/init.d/xinetd start 

查看端口号确认

  
 
 
  1. [root@master xinetd.d]#  netstat -antup|grep xinetd 
  2. tcp        0      0 0.0.0.0:9201                0.0.0.0:*                   LISTEN      3077/xinetd          
  3. tcp        0      0 0.0.0.0:9202                0.0.0.0:*                   LISTEN      3077/xinetd    

 

3、monitor主机安装haproxy

  
 
 
  1. tar zxvf haproxy-1.4.23.tar.gz 
  2. cd haproxy-1.4.23  
  3. make TARGET=linux26 ARCH=x86_64 
  4. make install 

 

4、配置haproxy配置文件

vi /usr/local/haproxy-1.4.23/conf/haproxy-db.cfg

  
 
 
  1. # HAProxy configuration - haproxy-db.cfg 
  2.  
  3. global 
  4. maxconn 4096 
  5. daemon 
  6. pidfile /usr/local/haproxy-1.4.23/haproxy.pid 
  7. #debug 
  8. #quiet 
  9. #chroot /usr/share/haproxy 
  10.  
  11. defaults 
  12. log     global 
  13. mode    http 
  14. #option  httplog 
  15. option  dontlognull 
  16. log 127.0.0.1 local0 
  17. retries 3 
  18. option redispatch 
  19. maxconn 4096 
  20. timeout connect 1000ms 
  21. timeout client 50000ms 
  22. timeout server 50000ms 
  23.  
  24. listen  stats :8011 
  25. balance 
  26. mode http 
  27. stats enable 
  28. stats auth root:monitor 
  29.   
  30. ## 
  31. ## FRONTEND ## 
  32. ## 
  33.   
  34. Load-balanced IPs for DB writes and reads 
  35. frontend db_write 
  36. mode tcp 
  37. bind 192.168.1.105:3306 
  38. default_backend cluster_db_write 
  39.   
  40. frontend db_read 
  41. mode tcp 
  42. bind 192.168.1.113:3306 
  43. default_backend cluster_db_read 
  44.   
  45. # Monitor DB server availability 
  46. frontend monitor_master 
  47. set master_backup to 'up' or 'down' 
  48. bind 127.0.0.1:9301 
  49. mode http 
  50. #option nolinger 
  51.   
  52. acl no_repl_master nbsrv(master_replication) eq 0 
  53. acl no_repl_slave1 nbsrv(slave1_replication) eq 0 
  54. acl no_master nbsrv(master_status) eq 0 
  55. acl no_slave1 nbsrv(slave1_status) eq 0 
  56.   
  57. monitor-uri /monitor 
  58. monitor fail unless no_repl_master no_repl_slave1 no_slave1 
  59. monitor fail if no_master no_slave1 
  60.   
  61. frontend monitor_slave1 
  62. set slave1_backup to 'up' or 'down' 
  63. bind 127.0.0.1:9302 
  64. mode http 
  65. #option nolinger 
  66.   
  67. acl no_repl_master nbsrv(master_replication) eq 0 
  68. acl no_repl_slave1 nbsrv(slave1_replication) eq 0 
  69. acl no_master nbsrv(master_status) eq 0 
  70. acl no_slave1 nbsrv(slave1_status) eq 0 
  71.   
  72. monitor-uri /monitor 
  73. monitor fail unless no_repl_master no_repl_slave1 no_master 
  74. monitor fail if no_master no_slave1 
  75.   
  76. frontend monitor_slave2 
  77. set slave2 read-only slave to 'down' 
  78. bind 127.0.0.1:9303 
  79. mode http 
  80. #option nolinger 
  81.   
  82. acl no_repl_slave2 nbsrv(slave2_replication) eq 0 
  83. acl no_repl_master nbsrv(master_replication) eq 0 
  84. acl slave1 nbsrv(slave1_status) eq 1 
  85.   
  86. monitor-uri /monitor 
  87. monitor fail if no_repl_slave2 
  88. monitor fail if no_repl_master slave1 
  89.   
  90. frontend monitor_slave3 
  91. set slave3 read-only slave to 'down' 
  92. bind 127.0.0.1:9304 
  93. mode http 
  94. #option nolinger 
  95.   
  96. acl no_repl_slave3 nbsrv(slave3_replication) eq 0 
  97. acl no_repl_master nbsrv(master_replication) eq 0 
  98. acl slave1 nbsrv(slave1_status) eq 1 
  99.   
  100. monitor-uri /monitor 
  101. monitor fail if no_repl_slave3 
  102. monitor fail if no_repl_master slave1 
  103.   
  104. frontend monitor_slave4 
  105. set slave4 read-only slave to 'down' 
  106. bind 127.0.0.1:9305 
  107. mode http 
  108. #option nolinger 
  109.   
  110. acl no_repl_slave4 nbsrv(slave4_replication) eq 0 
  111. acl no_repl_slave1 nbsrv(slave1_replication) eq 0 
  112. acl master nbsrv(master_status) eq 1 
  113.   
  114. monitor-uri /monitor 
  115. monitor fail if no_repl_slave4 
  116. monitor fail if no_repl_slave1 master 
  117.   
  118. # Monitor for split-brain syndrome 
  119. frontend monitor_splitbrain 
  120. set master_splitbrain and slave1_splitbrain to 'up' 
  121. bind 127.0.0.1:9300 
  122. mode http 
  123. #option nolinger 
  124.   
  125. acl no_repl01 nbsrv(master_replication) eq 0 
  126. acl no_repl02 nbsrv(slave1_replication) eq 0 
  127. acl master nbsrv(master_status) eq 1 
  128. acl slave1 nbsrv(slave1_status) eq 1 
  129.   
  130. monitor-uri /monitor 
  131. monitor fail unless no_repl01 no_repl02 master slave1 
  132.   
  133. ## 
  134. ## BACKEND ## 
  135. ## 
  136.   
  137. Check every DB server replication status 
  138. # - perform an http check on port 9201 (replication status) 
  139. # - set to 'down' if response is '503 Service Unavailable' 
  140. # - set to 'up' if response is '200 OK' 
  141. backend master_replication 
  142. mode tcp 
  143. balance roundrobin 
  144. option tcpka 
  145. option httpchk 
  146. server master 192.168.1.106:3306 check port 9202 inter 5s rise 1 fall 1 
  147.   
  148. backend slave1_replication 
  149. mode tcp 
  150. balance roundrobin 
  151. option tcpka 
  152. option httpchk 
  153. server slave1 192.168.1.107:3306 check port 9202 inter 5s rise 1 fall 1 
  154.   
  155. backend slave2_replication 
  156. mode tcp 
  157. balance roundrobin 
  158. option tcpka 
  159. option httpchk 
  160. server slave2 192.168.1.110:3306 check port 9202 inter 5s rise 1 fall 1 
  161.   
  162. backend slave3_replication 
  163. mode tcp 
  164. balance roundrobin 
  165. option tcpka 
  166. option httpchk 
  167. server slave3 192.168.1.111:3306 check port 9202 inter 5s rise 1 fall 1 
  168.   
  169. backend slave4_replication 
  170. mode tcp 
  171. balance roundrobin 
  172. option tcpka 
  173. option httpchk 
  174. server slave4 192.168.1.112:3306 check port 9202 inter 5s rise 1 fall 1 
  175.   
  176. Check Master DB server mysql status 
  177. # - perform an http check on port 9201 (mysql status) 
  178. # - set to 'down' if response is '503 Service Unavailable' 
  179. # - set to 'up' if response is '200 OK' 
  180. backend master_status 
  181. mode tcp 
  182. balance roundrobin 
  183. option tcpka 
  184. option httpchk 
  185. server master 192.168.1.106:3306 check port 9201 inter 5s rise 2 fall 2 
  186.   
  187. backend slave1_status 
  188. mode tcp 
  189. balance roundrobin 
  190. option tcpka 
  191. option httpchk 
  192. server slave1 192.168.1.107:3306 check port 9201 inter 5s rise 2 fall 2 
  193.   
  194. # DB write cluster 
  195. # Failure scenarios: 
  196. # - replication 'up' on master &amp; slave1 = writes to master 
  197. # - replication 'down' on slave1 = writes to master 
  198. # - replication 'down' on master = writes to slave1 
  199. # - replication 'down' on master &amp; slave1 = go nowhere, split-brain, cluster FAIL! 
  200. # - mysql 'down' on slave1 = writes to master_backup 
  201. # - mysql 'down' on master = writes to slave1_backup 
  202. # - mysql 'down' on master &amp; slave1 = go nowhere, cluster FAIL! 
  203. backend cluster_db_write 
  204. # - max 1 db server available at all times 
  205. # - master is preferred (top of list) 
  206. # - db_backups set their 'up' or 'down' based on results from monitor_monitor 
  207. mode tcp 
  208. option tcpka 
  209. balance roundrobin 
  210. option httpchk GET /monitor 
  211. server master 192.168.1.106:3306 weight 1 check port 9202 inter 5s rise 2 fall 1 
  212. server slave1 192.168.1.107:3306 weight 1 check port 9202 inter 5s rise 2 fall 1 backup 
  213. server master_backup 192.168.1.106:3306 weight 1 check port 9301 inter 5s rise 2 fall 2 addr 127.0.0.1 backup 
  214. server slave1_backup 192.168.1.107:3306 weight 1 check port 9302 inter 5s rise 2 fall 2 addr 127.0.0.1 backup 
  215.   
  216. # DB read cluster 
  217. # Failure scenarios 
  218. # - replication 'up' on master &amp; slave1 = reads on master, slave1, all db_slaves 
  219. # - replication 'down' on slave1 = reads on master, slaves of master 
  220. # - replication 'down' on master = reads on slave1, slaves of slave1 
  221. # - replication 'down' on master &amp; slave1 = reads on master_splitbrain and master_splitbrain only 
  222. # - mysql 'down' on slave1 = reads on master_backup, slaves of master 
  223. # - mysql 'down' on master = reads on slave1_backup, slaves of slave1 
  224. # - mysql 'down' on master &amp; slave1 = go nowhere, cluster FAIL! 
  225. backend cluster_db_read 
  226. # - max 2 master db servers available at all times 
  227. # - max N slave db servers available at all times except during split-brain 
  228. # - monitor track 'up' and 'down' of monitor in the cluster_db_write 
  229. # - db_backups track 'up' and 'down' of db_backups in the cluster_db_write 
  230. # - db_splitbrains set their 'up' or 'down' based on results from monitor_splitbrain 
  231. mode tcp 
  232. option tcpka 
  233. balance roundrobin 
  234. option httpchk GET /monitor 
  235. server master 192.168.1.106:3306 weight 1 track cluster_db_write/master 
  236. server slave1 192.168.1.107:3306 weight 1 track cluster_db_write/slave1 
  237. server master_backup 192.168.1.106:3306 weight 1 track cluster_db_write/master_backup 
  238. server slave1_backup 192.168.1.107:3306 weight 1 track cluster_db_write/slave1_backup 
  239. server master_splitbrain 192.168.1.106:3306 weight 1 check port 9300 inter 5s rise 1 fall 2 addr 127.0.0.1 
  240. server slave1_splitbrain 192.168.1.107:3306 weight 1 check port 9300 inter 5s rise 1 fall 2 addr 127.0.0.1 
  241. # Scaling &amp; redundancy options 
  242. # - db_slaves set their 'up' or 'down' based on results from monitor_monitor 
  243. # - db_slaves should take longer to rise 
  244. server slave2_slave 192.168.1.110:3306 weight 1 check port 9303 inter 5s rise 5 fall 1 addr 127.0.0.1 
  245. server slave3_slave 192.168.1.111:3306 weight 1 check port 9304 inter 5s rise 5 fall 1 addr 127.0.0.1 
  246. server slave4_slave 192.168.1.112:3306 weight 1 check port 9305 inter 5s rise 5 fall 1 addr 127.0.0.1 

 

5、启动haproxy

  
 
 
  1. haproxy -f /usr/local/haproxy-1.4.23/conf/haproxy-db.cfg 

监控地址:http://192.168.1.200:8011/haproxy?stats
user:root    password:monitor

 

一些参数说明 :
maxconn <number>
  Sets the maximum per-process number of concurrent connections to <number>. It
  is equivalent to the command-line argument "-n". Proxies will stop accepting
  connections when this limit is reached.
daemon
  Makes the process fork into background. This is the recommended mode of
  operation. It is equivalent to the command line "-D" argument. It can be
  disabled by the command line "-db" argument.
pidfile <pidfile>
  Writes pids of all daemons into file <pidfile>. This option is equivalent to
  the "-p" command line argument. The file must be accessible to the user
  starting the process.
retries <value>
  Set the number of retries to perform on a server after a connection failure
  May be used in sections:    defaults | frontend | listen | backend
                                 yes   |    no    |   yes  |   yes
  Arguments :
    <value>   is the number of times a connection attempt should be retried on
              a server when a connection either is refused or times out. The
              default value is 3.

  It is important to understand that this value applies to the number of
  connection attempts, not full requests. When a connection has effectively
  been established to a server, there will be no more retry.

  In order to avoid immediate reconnections to a server which is restarting,
  a turn-around timer of 1 second is applied before a retry occurs.

  When "option redispatch" is set, the last retry may be performed on another
  server even if a cookie references a different server.

  See also : "option redispatch"
option redispatch
no option redispatch
  Enable or disable session redistribution in case of connection failure
  May be used in sections:    defaults | frontend | listen | backend
                                 yes   |    no    |   yes  |   yes
  Arguments : none

  In HTTP mode, if a server designated by a cookie is down, clients may
  definitely stick to it because they cannot flush the cookie, so they will not
  be able to access the service anymore.

  Specifying "option redispatch" will allow the proxy to break their
  persistence and redistribute them to a working server.

  It also allows to retry last connection to another server in case of multiple
  connection failures. Of course, it requires having "retries" set to a nonzero
  value.

  This form is the preferred form, which replaces both the "redispatch" and
  "redisp" keywords.

  If this option has been enabled in a "defaults" section, it can be disabled
  in a specific instance by prepending the "no" keyword before it.
option dontlognull
no option dontlognull
  Enable or disable logging of null connections
  May be used in sections :   defaults | frontend | listen | backend
                                 yes   |    yes   |   yes  |   no
  Arguments : none

  In certain environments, there are components which will regularly connect to
  various systems to ensure that they are still alive. It can be the case from
  another load balancer as well as from monitoring systems. By default, even a
  simple port probe or scan will produce a log. If those connections pollute
  the logs too much, it is possible to enable option "dontlognull" to indicate
  that a connection on which no data has been transferred will not be logged,
  which typically corresponds to those probes.

  It is generally recommended not to use this option in uncontrolled
  environments (eg: internet), otherwise scans and other malicious activities
  would not be logged.

  If this option has been enabled in a "defaults" section, it can be disabled
  in a specific instance by prepending the "no" keyword before it.


另外,使用keepalived实现代理层的HA。
 

本文出自 “与IT一起的日子” 博客,请务必保留此出处http://raugher.blog.51cto.com/3472678/1178237