一、本次环境架构图

  由于公司内网服务器有限,所以后端采用Mariadb自带的mysql_multi模型实现多实例。

mysql的多实例有两种方式可以实现,两种方式各有利弊。

  1、使用多个配置文件启动不同的进程来实现多实例,这种方式的优势逻辑简单,配置简单,缺点是管理起来不太方便。

  2、通过官方自带的mysqld_multi使用单独的配置文件来实现多实例,这种方式定制每个实例的配置不太方便,优点是管理起来很方便,集中管理。

二、mariadb多实例实现:

mariadb配置文件如下(红色部分为修改内容):

注意使用了mysqld_multi,就不能在启用mysqld模块,红色部分为修改或者添加内容

[client]
port =
socket = /tmp/mysql.sock
#default-character-set=utf8 [mysqld_multi] # 启用 mysqld_multi 多实例模式
mysqld = /usr/local/mysql/bin/mysqld_safe # 指定两个管理命令
mysqladmin = /usr/local/mysql/bin/mysqladmin [mysqld1] # 定义mysql1实例
port =
socket = /tmp/mysql3306.sock
basedir = /usr/local/mysql
datadir = /mysqldata/data3306
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache =
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size =
query_cache_size = 32M
thread_concurrency =
log-bin=mysql-bin-1
server-id = 1 # 标记server-id 不能重复
log-bin=mysql-bin3306 # 用于同步数据的日志文件
binlog_ignore_db = mysql # 忽视mysql库的同步
log_slave_updates # 从库binlog记录主库同步的操作日志
slave_skip_errors = all # 跳过从库出错的SQL
auto_increment_increment = 2 # 主主同步时,每次递增量
auto_increment_offset = 1 # 主主同步,从自增开始,从那个数开始自增 [mysqld2]
port =
socket = /tmp/mysql3307.sock
basedir = /usr/local/mysql
datadir = /mysqldata/data3307
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8
log-bin=mysql-bin-2
server-id = 2
log_bin=mysql-bin3307
log_slave_updates
auto_increment_increment =
auto_increment_offset = 2 [mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
default-character-set = utf8
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout

初始化数据库:

[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mysqldata/data3306/
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mysqldata/data3307/

启动库:
# 这里有很多种启动方式 mysqld_multi start 1, mysqld_multi start 2
# 注意这里是启动实例,则不需要启动mysqld

[root@localhost mysql]# mysqld_multi start -
[root@localhost mysql]# ss -ntpl | grep mysqld
LISTEN *: *:* users:(("mysqld",pid=,fd=))
LISTEN *: *:* users:(("mysqld",pid=,fd=))

连接实例库:

连接3306

[root@localhost ~]# mysql -uroot -S /tmp/mysql3306.sock

连接3307

[root@localhost ~]# mysql -uroot -S /tmp/mysql3307.sock

三、实现mariadb 主主同步

1. 在两个实例中分别创建用于同步的用户。注:用于同步的用户必须具备: replication slave, reload, super 权限

3306库:

MariaDB [(none)]> GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'backup'@'192.168.118.187' identified by '';

3307库:

MariaDB [(none)]> GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'backup'@'192.168.118.187' identified by '';

2. 分别查看两个实例的master log 和 Position

3306库:

MariaDB [(none)]> show master status\G
*************************** . row ***************************
File: mysql-bin3306.
Position:
Binlog_Do_DB:
Binlog_Ignore_DB: mysql

3307库:

MariaDB [(none)]> show master status\G
*************************** . row ***************************
File: mysql-bin3307.
Position:
Binlog_Do_DB:
Binlog_Ignore_DB:

3. 分别为两个实例配置master 互为主备

3306实例配置:

# 这里的master为在实例3307上配置的用户信息,master_log_file 为3307的master file master_log_pos 为 3307的Position

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.118.187', MASTER_PORT=, MASTER_USER='backup', MASTER_PASSWORD='', MASTER_LOG_FILE='mysql-bin3307.000001', MASTER_LOG_POS=;

3307实例配置:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.118.187', MASTER_PORT=, MASTER_USER='backup', MASTER_PASSWORD='', MASTER_LOG_FILE='mysql-bin3306.000001', MASTER_LOG_POS=;
MariaDB [(none)]> show slave status\G     # 查看是否配置成功

*************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.118.187
Master_User: backup
Master_Port:
Connect_Retry:
Master_Log_File: mysql-bin3307.
Read_Master_Log_Pos:
Relay_Log_File: localhost-relay-bin.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-bin3307.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

这里最主要的两个参数:Slave_IO_Running: Yes、 Slave_SQL_Running: Yes  如果这里都是Yes表示配置成功。配置master时,注意思路要清晰,端口不能错。

4. 测试:

MariaDB [(none)]> CREATE DATABASE hello_db;
Query OK, row affected (0.00 sec) MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hello_db |
| mysql |
| performance_schema |
| test |
+--------------------+
rows in set (0.00 sec) 3307库查看是否同步: MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hello_db |
| mysql |
| performance_schema |
| test |
+--------------------+

3307 删除hello_db:

MariaDB [(none)]> DROP DATABASE hello_db;
Query OK, rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; 查看是否同步删除: MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+

通过以上测试,Mariadb主主配置成功。

四、配置HAProxy实现后端mariadb负载均衡

[root@localhost ~]# yum install haproxy -y 

HAProxy 配置文件:

global
log 127.0.0.1 local2 chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn
user haproxy
group haproxy
daemon stats socket /var/lib/haproxy/stats defaults
mode http
log global
option tcplog
option dontlognull
#option http-server-close
#option forwardfor except 127.0.0.0/
option redispatch
retries
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn listen proxy-sql 192.168.118.187: # 创建proxy-sql
mode tcp
balance roundrobin # 算法为轮询
option mysql-check user haproxy # 在mysql中创建无任何权限用户haproxy,且无密码用于监控
server mysql3306 192.168.118.187: check maxconn weight # 后端主机
server mysql3307 192.168.118.187: check maxconn weight [root@localhost haproxy]# ss -tnlp | grep haproxy
LISTEN 192.168.118.187: *:* users:(("haproxy",pid=,fd=))

2. 创建用于监控的mariadb 用户 haproxy

# 两个实例都需要创建,创建一个后,可以直接查看第二个实例是否也同步了。

MariaDB [(none)]> CREATE USER 'haproxy'@'%' ;

3. 通过haproxy端口连接数据库

  HAProxy工作原理:当HAProxy接收到用户请求后,不是直接透明转发客户端请求到后端服务器,而是HAProxy到后端服务器取数据。
  由此可见,当客户端发情mariadb连接请求后,由HAProxy来建立连接mariadb。因此,HAProxy客户端地址为HAProxy服务器地址而不是客户端地址。

  PS: 因为这里HAProxy是对外服务,所以监听的地址是:192.168.118.187 而不是本地回环地址,因此需要对IP地址为192.168.118.187赋予权限。

  这里就牵扯到mariadb权限的问题,给与haproxy地址访问权限:

MariaDB [(none)]> GRANT ALL ON *.* TO 'root'@'192.168.118.187' IDENTIFIED BY '';

  以上操作必须要保证两个实例都要具备:

MariaDB [(none)]> SELECT HOST, USER, PASSWORD FROM mysql.user WHERE HOST='192.168.118.187';
+-----------------+--------+-------------------------------------------+
| HOST | USER | PASSWORD |
+-----------------+--------+-------------------------------------------+
| 192.168.118.187 | backup | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 192.168.118.187 | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------------+--------+-------------------------------------------+

启动服务

[root@localhost ~]# systemctl start haproxy     # 启动HAProxy服务

4. 本地测试:

[root@localhost ~]# mysql -uroot -p123456 -P  -h 192.168.118.187
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is
Server version: 5.5.-MariaDB MariaDB Server Copyright (c) , , Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>

本次测试成功。

再次使用Navicat连接:

这样通过HAProxy代理到后端mariadb负载成功。

五、总结:

1. 这样的架构最好只是在测试环境使用,因为影响到的因素会很多。比如磁盘IO问题:用户请求响应的IO,实例同步的IO。
    生产环境建议如下架构:

[ Mariadb ] 通过HAProxy代理后端Mariadb实现负载均衡的更多相关文章

  1. haproxy+keepalived实现高可用负载均衡

    软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HA ...

  2. haproxy+keepalived实现高可用负载均衡(转)

      软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. ...

  3. HAProxy & Keepalived L4-L7 高可用负载均衡解决方案

    目录 文章目录 目录 HAProxy 负载均衡器 应用特性 性能优势 会话保持 健康检查 配置文件 负载均衡策略 ACL 规则 Web 监控平台 Keepalived 虚拟路由器 核心组件 VRRP ...

  4. HAProxy实现动静分离和负载均衡

    由于电脑配置渣,带不动多台虚拟机,所以采用httpd虚拟主机的方式来实现 1 2 3 CentOS 6.7 httpd: 2.2.15 HAProxy: 1.5.4 主机规划 1 2 3 4 5 - ...

  5. Nginx代理tcp端口实现负载均衡

    Nginx代理tcp端口实现负载均衡 1.修改配置文件 vi /etc/nginx/nginx.conf 添加如下配置: stream { ###XXX upstream notify {   has ...

  6. Azure Application Gateway(二)对后端 VM 进行负载均衡

    一,引言 上一节有讲到使用 Azure Application Gateway 为我们后端类型为 Web App 的 Demo 项目提供负载均衡,Azure Application Gateway 的 ...

  7. Azure Front Door(二)对后端 VM 进行负载均衡

    一,引言 上一篇我们讲到通过 Azure Front Door 为我们的 Azure App Service 提供流量转发,而整个 Azure Front Door 在添加后端池的时候可选的后端类型是 ...

  8. 负载均衡服务之HAProxy https配置、四层负载均衡以及访问控制

    前文我们聊了下haproxy的访问控制ACL的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12817773.html:今天我们来聊一聊haproxy的h ...

  9. 003.HAProxy ACL规则的智能负载均衡

    一 简介 HAProxy可以工作在第七层模型,可通过ACL规则实现基于HAProxy的智能负载均衡系统,HAProxy通过ACL规则完成以下两种主要功能: 通过ACL规则检查客户端请求是否合法,如果符 ...

随机推荐

  1. 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第二道——两数差的和

    题目 给 n 个实数 a_1, a_2 ... a_n, 要求计算这 n 个数两两之间差的绝对值下取整后的和是多少. 输入描述 第一行为一个正整数 n 和一个整数 m.接下来 n 行,第 i 行代表一 ...

  2. 软件工程项目组Z.XML会议记录 2013/11/20

    软件工程项目组Z.XML会议记录 [例会时间]2013年11月20日星期三21:00-22:00 [例会形式]小组讨论 [例会地点]学生公寓3号楼会客厅 [例会主持]李孟 [会议记录]李孟 会议整体流 ...

  3. 修改虚拟机上Linux系统的IP地址

    然后再输入:ifconfig eth0 192.168.11.6 netmask 255.255.255.0   . 这样就可以把网卡eth0的IP地址修改为 192.168.11.6

  4. elasticsearch-1.7.1 (es Windows 64)

    elasticsearch-1.7.1 (es Windows 64) https://blog.csdn.net/qq_27093465/article/details/53544541 elast ...

  5. 【bzoj1391】[Ceoi2008]order 网络流最小割

    原文地址:http://www.cnblogs.com/GXZlegend/p/6796937.html 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序 ...

  6. hdu 1787 GCD Again (欧拉函数)

    GCD Again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. SNMP协议介绍

    SNMP协议介绍 一.什么是SNMP SNMP:“简单网络管理协议”,用于网络管理的协议.SNMP用于网络设备的管理.SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了 “读”操作:管理 ...

  8. 【题解】NOIP2016换教室

    哇好开心啊!写的时候真的全然对于这个加法没有把握,但还是大着胆子试着写了一下——竟然过了样例?于是又调了一下就过啦. 不过想想也觉得是正确的吧,互相独立的事件对于期望的影响自然也是相互独立的,可以把所 ...

  9. n元线性方程非负整数解的个数问题

    设方程x1+x2+x3+...+xn = m(m是常数) 这个方程的非负整数解的个数有(m+n-1)!/((n-1)!m!),也就是C(n+m-1,m). 具体解释就是m个1和n-1个0做重集的全排列 ...

  10. 编写clearedit的安卓控件

    1.写一个自定义的控件 public class ClearEditText extends AppCompatEditText implements View.OnFocusChangeListen ...