haproxy实现mysql数据库负载均衡
但对照此文实现mysql负载均衡中碰到一些问题,解决这些问题的同时也顺便学习了所涉及到的知识点,在这里一一记录下。
1.在xinetd.d目录下设置了service的端口,但是通过netstat -nap|grep 端口 发现找不到该端口
问题涉及到得知识点:
1.1 xinetd托管的服务的端口设置是在/etc/services 文件中设置
1.2 xinetd.d中的service 的名称必须和/etc/services 中设置的名称一样,否则无法启动
2.
ERROR_MSG=/usr/bin/mysql --host=$MYSQL_HOST --port=$MYSQL_PORT --user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD -e "show databases;"
此句单独执行无问题,但放在shell批处理文件中执行,将会在这一句报错,有人说把=后边的命令用边括号括起来可以解决问题,但实际上并没有真正的解决问题,而是隐藏了问题(把ERROR_MSG赋值为字符串,而不是=后边的命令执行结果),如果希望在shell批处理中得到命令行执行的结果,正确的写法应该是把命令行放入$()中,此句正确写法应该是
ERROR_MSG=$(/usr/bin/mysql --host=$MYSQL_HOST --port=$MYSQL_PORT --user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD -e "show databases;" )
3.写好干净的批处理文件后,直接执行该批处理文件,可以得到正确结果,但是如果通过xinetd的端口托管访问时,连接始终一闪而过,查看系统日志会出现
Apr2222:01:47 AY1304111122016 xinetd[20001]: START: mysqlchk pid=20126 from=127.0.0.1Apr2222:01:47 AY1304111122016 xinetd[20126]: execv(/home/fulu/download/mysqlchk_status2.sh ) failed:Exec format error (errno =8)Apr2222:01:47 AY1304111122016 xinetd[20001]: EXIT: mysqlchk status=0 pid=20126 duration=0(sec)
此问题一开始始终无法找到解决方案,但是通过不懈的google,终于找到病灶了,原来是批处理文件的第一行一定要包含文件命令行注释,格式#+!+命令行路径
#!/bin/bash
也就是说如果批处理文件希望被其他的程序(python,xinetd)调用时,一定要在文件第一行加一句命令行申明注释,并遵循固定格式4.linux上安装启动多个mysql服务器,原文参看http://www.net527.cn/a/caozuoxitong/Linux/8688.html;最优方案为在一个mysql-server的基础上新初始化一个mysql数据,主要步骤4.1 初始化新的数据mysql_install_db --defaults-file=/etc/my.2.cnf
4.2 启动新的数据库mysqld_safe --defaults-file=/etc/my.2.cnf
至于数据库存放位置,进程,日志等路径均可在配置文件中设置,安装完成后,需要将配置文件中涉及到的路径的拥有者设置为mysql
5.真实的线上数据库负载均衡环境方案为
5.1 多个webserver》一个haproxy作为数据库负载均衡控制器》多个mysql服务器(建议两个主主,多个从)
5.2 多个webserver》多个mysql服务器(与webserver一对一)》共享的数据节点
ndbd 【方案参考:http://www.iteye.com/topic/149130】,个人不看好此方式
6.效率有待测试,暂时仅仅部署成功,后续补上测试报告