MySQL(mariadb)多实例应用与多实例主从复制

MySQL多实例

mysql多实例,简单理解就是在一台服务器上,mysql服务开启多个不同的端口(如3306、3307,3308),运行多个服务进程。这些 mysql 服务进程通过不同的 socket来监听不同的数据端口,进而互不干涉的提供各自的服务。

在同一台服务器上,mysql 多实例会去共用一套 mysql 应用程序,因此在部署 mysql的时候只需要部署一次 mysql程序即可,无需多次部署。但是,mysql多实例之间会各自使用不同的 my.cnf 配置文件、启动程序和数据文件。在提供服务方面,mysql多实例在逻辑上看起来是各自独立,互不干涉的,并且多个实例之间是根据配置文件的设定值,来获取相关服务器的硬件资源。

多实例应用场景

  1. 当一个公司业务访问量不太大,又想节俭成本,并且还希望不同业务的数据库服务能够各自尽量独立,提供服务能够互相不受影响。另外还需要应用主从同步等技术来提供数据库备份或读写分离服务,以及方便后期业务量增大时,数据库架构的扩展和迁移。
  2. 公司业务访问量不是太大的时候,服务器的资源基本都是过剩状态。此时就很适合 mysql 多实例的应用。如果对 SQL语句 优化做的比较好,mysql 多实例 是一个很值得去使用的技术。
  3. 测试环境,公司中会需要数据库环境来测试业务,在单机上部署多实例也能够节省成本

MySQL多实例实现方式

mysql 多实例常规来讲,有三种方案可以实现,这三种方案各有利弊,如下:

  • 基于多配置文件通过使用多个配置文件来启动不同的进程,以此来实现多实例。

优点:逻辑简单,配置简单

缺点:管理起来不方便

  • 基于mysqld_multi通过官方自带的 mysqld_multi 工具,使用单独配置文件来实现多实例

优点: 便于集中管理管理

缺点: 不方便针对每个实例配置进行定制

  • 基于IM使用 MySQL 实例管理器(MYSQLMANAGER),这个方法好像比较好不过也有点复杂

优点:便于集中管理

缺点:耦合度高。IM一挂,实例全挂

不方便针对每个实例配置进行定制

本章内容采用第一种方式来是实现,(个人倾向于这种方式),数据库采用mariadb来代替mysql,过程都一样

系统与安装版本信息
操作系统:Centos6.9
数据库:mariadb-10.2.15.tar.gz
三个实例:3306,3307,3308

MySQL多实例安装

安装mysql

  • 安装依赖包
yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake libevent-devel gnutls-devel libaio-devel openssl-devel ncurses-devel libxml2-devel 

创建mysql用户组

useradd -r mysql

创建实例数据库目录
各实例的数据库目录,配置文件目录,启动程序目录都存放在单独的目录位置,结构如下:

[[email protected] ~]# mkdir -p /data/mysql/{3306,3307,3308}/{data,etc,log,socket,bin}
[[email protected] ~]# tree /data
/data
├── lost+found
└── mysql
    ├── 3306
    │?? ├── bin
    │?? ├── data
    │?? ├── etc
    │?? ├── log
    │?? └── socket
    ├── 3307
    │?? ├── bin
    │?? ├── data
    │?? ├── etc
    │?? ├── log
    │?? └── socket
    ├── 3308
    │?? ├── bin
    │?? ├── data
    │?? ├── etc
    │?? ├── log
    │?? └── socket
    └── mysqld

解压安装源码包

[[email protected] ~]# tar zxvf mariadb-10.2.15
[[email protected] ~]# cd mariadb-10.2.15

#编译
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  -DCMAKE-USER=mysql  -DCMAKE-GROUP=mysql -DMYSQL_DATADIR=/data/mysql -DWITHOUT_TOKUDB=1

如果执行cmake提示:CMake Error at storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake:183 (message):
添加编译参数:-DWITHOUT_TOKUDB=1

make  -j  4
make  install

安装成功后先不初始化,把配置文件,启动脚本文件都配置完成后再执行初始化

复制配置文件到各实例的etc目录下

配置文件在源码包解压目录下

[[email protected] support-files]# cp my-huge.cnf /data/mysql/3306/etc/my.cnf
[[email protected] support-files]# cp my-huge.cnf /data/mysql/3307/etc/my.cnf
[[email protected] support-files]# cp my-huge.cnf /data/mysql/3308/etc/my.cnf

修改配置文件内容,3306,3307,3308各实例配置文件修改my.cnf内容,修改端口,socket路径,数据存放目录等

[client]
#password       = your_password
port            = 3306
socket          = /data/mysql/3306/socket/mysql.sock

[mysqld]
port            = 3306
socket          = /data/mysql/3306/socket/mysql.sock
datadir=/data/mysql/3306

同样,3307,3308实例也要修改相同的配置

编写服务启动脚本

#!/bin/bash

port=3306
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/local/mysql/bin"
mysql_basedir="/data/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

function_start_mysql()
{
    if [ ! -e "$mysql_sock" ];then
      printf "Starting MySQL...\n"
      ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf  &> /dev/null  &
    else
      printf "MySQL is running...\n"
      exit
    fi
}

function_stop_mysql()
{
    if [ ! -e "$mysql_sock" ];then
       printf "MySQL is stopped...\n"
       exit
    else
       printf "Stoping MySQL...\n"
#       ${cmd_path}/mysqladmin -u ${mysql_user} -S ${mysql_sock} shutdown
       ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
   fi
}

function_restart_mysql()
{
    printf "Restarting MySQL...\n"
    function_stop_mysql
    sleep 2
    function_start_mysql
}

case $1 in
start)
    function_start_mysql
;;
stop)
    function_stop_mysql
;;
restart)
    function_restart_mysql
;;
*)
    printf "Usage: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac

上面的脚本要准备三份,因为mysql实例是各自独立管理的,将上面的脚本参数port变量修改成3307,3308即可,放在 各自实例的bin目录,服务启动是从各自实例的bin目录下执行这脚本

port=3307
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/local/mysql/bin"
mysql_basedir="/data/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"

初始化数据库

[[email protected] mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/3306/data

[[email protected] mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/3307/data

[[email protected] mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/3308/data

修改mysql实例目录属主

chown -R mysql:mysql /data/mysql

启动各实例服务

[[email protected] ~]# /data/mysql/3306/bin/mysqld start
[[email protected] ~]# /data/mysql/3307/bin/mysqld start
[[email protected] ~]# /data/mysql/3308/bin/mysqld start
[[email protected] mysql]# ss -tnl
State      Recv-Q Send-Q                                 Local Address:Port                                   Peer Address:Port
LISTEN     0      80                                                :::3306                                             :::*
LISTEN     0      80                                                :::3307                                             :::*
LISTEN     0      80                                                :::3308                                             :::*
LISTEN     0      128                                               :::22                                               :::*   

测试登录

[[email protected] ~]# mysql -S /data/mysql/3306/socket/mysql.sock
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.2.15-MariaDB-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

MariaDB [(none)]> 

至此mysql的多实例安装完成,在这种多实例的环境下,可以单独使用个实例进行数据存储,也可以将各实例配置成主从架构进行使用,下面顺便把mysql的主从也介绍使实现一下,关于mysql的主从架构,以后会专门研究各种功能,这里只简单实现,能够帮助理清主从复制的工作过程和配置过程。

MySQL多实例主从复制

在开始主从配置之前先简单介绍一下mysql的主从复制原理,
mysql复制原理大致如下:
1,mysql主数据库在事物提交时会把数据变更作为事件events记录在二进制日志文件bin-log中,mysql主库上的sync_binlog参数控制bin-log日志刷新到磁盘

2,主库推送二进制日志文件bin-log中的事件到从库的中继日志Relay Log ,之后从库根据中继日志Relay log重写数据操作将数据写入从库,以此达到主库和从库的数据一致

mysql复制过程中通过3个线程来完成复制操作:其中binlog dump线程在主库上,I/O线程和SQL线程在从库上,当在从库上启动复制(START SLAVE)时,首先会I/O线程连接主库,(连接主库用户用主库创建),主库随后创建binlog dump线程读取数据库事件(binlog日志)并发送给I/O线程,I/O获取到binlog日志数据后更新到从库的中继日志Relay log中,从库上的SQL线程读取中继日志Relay log 中数据写入本地数据库,最终完成主从复制。

一主多从的实现

本文实现一主多重的方式,即上面的3个mysql实例,3306实例作为主库,3307和3308作为从库,实现主从复制的最为关键的是日志文件的设置,主库必须要开启二进制日志,从库要关闭二进制,并且开启中继日志relay log,要点如下:

  • 主库创建提供从库的同步用户
  • 主库开启二进制日志
  • 从库开启中继日志relay log,并关闭二进制日志功能
  • 主从之间的server-id不能相同
  • 主从时间同步 (由于在同一台主机,步奏略过)

配置主从库实例的配置文件

查看mysql是否开启二进制和中继日志

MariaDB [(none)]> show variables like ‘log_bin‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> show variables like ‘relay_log‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| relay_log     |       |
+---------------+-------+
1 row in set (0.00 sec)

mysql安装默认会启用二进制日志,但么有启动relay log,所以主库上无需设置,从库需要开启中继日志:
编辑实例3307,3308的my.cnf关闭bin-log,开启中继日志,修改server-id

3307实例:

#log-bin=mysql-bin
relay-log=relay-log
server-id       = 2

3308实例:

#log-bin=mysql-bin
relay-log=relay-log
server-id       = 3

修改后要重启3307,3308实例

[[email protected] ~]# /data/mysql/3307/bin/mysqld restart
Restarting MySQL...
Stoping MySQL...
Enter password:
Starting MySQL...
[[email protected] ~]# /data/mysql/3308/bin/mysqld restart
Restarting MySQL...
Stoping MySQL...
Enter password:    #这里提示要输入密码,因为中定义了要输入密码
Starting MySQL...

重启从库实例后检查日志启用情况

MariaDB [(none)]> show variables like ‘relay_log‘;
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| relay_log     | relay-log |
+---------------+-----------+
1 row in set (0.00 sec)

MariaDB [(none)]> show variables like ‘log_bin‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

主库创建同步复制的用户

MariaDB [(none)]> grant replication slave on *.* to [email protected]‘192.168.%.%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

查看主库的bin-log日志记录位置节点
因为在从库中使用change master to 指令连接主库时要指定连接时主库的bin-log日志记录位置节点。

MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      645 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

从库连接主库

登录到从库3307实例:

MariaDB [(none)]> change master to master_host=‘192.168.214.141‘,master_user=‘yufu‘,master_password=‘123456‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=645;
Query OK, 0 rows affected (0.11 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)

登录到从库3308实例:

MariaDB [(none)]> change master to master_host=‘192.168.214.141‘,master_user=‘yufu‘,master_password=‘123456‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=645;
Query OK, 0 rows affected (0.11 sec)

MariaDB [(none)]>  flush privileges;
Query OK, 0 rows affected (0.00 sec)

启动从库复制功能

启动3307实例并查看复制状态

MariaDB [(none)]> START SLAVE;      #
Query OK, 0 rows affected (0.80 sec)

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.214.141
                  Master_User: yufu
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 645
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 555
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes         #同时为yes才能成功同步数据
            Slave_SQL_Running: Yes

启动3308实例并查看复制状态

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.214.141
                  Master_User: yufu
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 645
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 555
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

至此,配置启动都没有问题,下面从主库实例3306中写入一些数据看看看看3307,3308实例能不能正常同步数据

测试同步

登录主库3306实例写一些数据:

MariaDB [(none)]> create database yufu;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use yufu;
Database changed
MariaDB [yufu]> create table test(
    -> id varchar(10),
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.84 sec)

MariaDB [yufu]> insert into test values (‘2323‘,‘yufuname‘);
Query OK, 1 row affected (0.00 sec)

登录从库3307实例查看数据:

MariaDB [(none)]> select * from yufu.test;
+------+----------+
| id   | name     |
+------+----------+
| 2323 | yufuname |
+------+----------+
1 row in set (0.00 sec)

登录从库3308实例查看数据:

MariaDB [(none)]>  select * from yufu.test;
+------+----------+
| id   | name     |
+------+----------+
| 2323 | yufuname |
+------+----------+
1 row in set (0.01 sec)

经过测试同步功能正常,文章最后再次总结一下mysql主从复制的要点:

1. 主库必须开启bin-log二进制日志
2. 从库必须开启中继日志Relay-log,关闭bin-log
3. 主从的server-id 必须不能相同
4. 主库创建同步用户
5. 确保上面设置后,登录从库执行 change master to 指令
6. 主从时间同步

在后面的文章里,会比较详细介绍使用mysql的主从复制功能

个人博客站点www.gudaoyufu.com

原文地址:http://blog.51cto.com/10054528/2125184

时间: 2024-10-02 17:13:19

MySQL(mariadb)多实例应用与多实例主从复制的相关文章

mysql 利用binlog增量备份,还原实例

mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据.这样减少服务器的负担. 二,启用binlog vi my.cnf log-bin=/var/lib/mysql/mysql-bin.log,如果是这样的话log-bin

MySQL数据库基础(3)多实例应用实战

一.什么是MySQL多实例? 简单的说,就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供各自的服务. 共用一套MySQL安装程序 使用不同(也可以相同)的my.cnf配置文件.启动程序.数据文件 作个比喻,MySQL多实例相当于房子的多个卧室一样,每个势力可以看做一个卧室,整个服务器就是一套房子.逻辑上是独立的,但是互相会有影响. 二.多实例的作用与问题 1.有效利用服务器资源 当单个服务器资

MySQL/MariaDB基础

数据库管理系统很早就有了,在最开始时,数据库管理的结构是层次化的,即层次模型,它是一个树形结构,可以通过有限次的查找来定位需要的数据,然而,这种查找还是需要遍历才能实现,所以这种模型应用时间不长久:之后有了网状模型,也就是多个树的集合:层次模型和网状模型都称为非关系型数据库.之后由Edgar Frank Codd提出了一个关系型数据库的模型,从此之后就有了关系模型,其中Oracle公司就是以此为原型开发了Oracle数据库:到现在又提出了反关系模型--No-SQL,它是非关系型的数据库,例如:键

关于数据库管理系统DBMS--关系型数据库(MySQL/MariaDB)

数据库管理系统--DBMS:用来管理数据库 数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统--RDBMS: 主要的组成部分是表:表是由行(实例,实体,记录)和列(字段,域)组成: 关系型数据库管理系统的实现: 商业方案:Oracle,Sybase{为微软提供了思路出现SQL-server},Infomix{IBM收购},DB2{IBM} 开源方案:PostgreSQ

记录CentOS 7.4 上安装MySQL&MariaDB&Redis&Mongodb

记录CentOS 7.4 上安装MySQL&MariaDB&Redis&Mongodb 前段时间我个人Google服务器意外不能用,并且我犯了一件很低级的错误,直接在gcp讲服务器实例给释放掉,导致我的数据全部丢失,现在新搞一个服务器,顺便记录一下CentOS 7.4 MySQL&MariaDB&Redis&Mongodb 的安装 1祝大家:诸事顺利,2019 发大财! 本人将一如既往,更新我的博客,努力为博客园贡献文章! Mysql 安装 随着CentOS

使用“忽略授权表”参数登录多实例数据库——用于多实例数据库忘记密码时登录

昨天上午,在视频"L10-008-lamp环境之MySQL多实例安装配置指南"马上就要结束的时候,再次遇到问题. 前天晚上,根据视频讲解在清理多余MySQL数据库账号后,就直接退出数据库并关机了(没有在清理账号后,退出数据库并重新登录数据库--其实,也没有必要做这样的测试).昨天早上打开虚拟机,想着完成视频的最后一小部分.没想到,在使用密码登录3306实例的时候,无论如何也登录不进去了. [[email protected] 3306]# mysql -uroot -p -S /dat

MySQL/MariaDB数据库基于SSL实现主从复制

前言 备份数据库是生产环境中的首要任务,有时候不得不通过网络进行数据库的复制,由于MySQL/MariaDB的主从复制是明文传送的,如果在生产环境中跨网络传送,数据的安全性就无法完全保证,为了解决这一问题,我们需要一种安全的方式进行传送,即基于SSL加密进行数据传输. 部署配置 实验拓扑 实验环境 系统环境:CentOS6.6 数据库版本:mariadb-5.5.36 #注意:主从服务器数据库版本须一致:主从服务器时间须同步 #此实验从服务器只做一组为例 配置主从复制 安装mariadb [[e

MySQL/MariaDB基于MMM实现读写分离及高可用

前言 MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的). MMM 优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是单点,可以结合Keepal

mysql(mariadb)更改root密码

1.mysql(mariadb)如何更改root密码,第一步是切换至root用户 2.mysql(mariadb)如何更改root密码,主要使用mysqladmin命令:完整命令:mysqladmin -u root -p password newpasswd : 语句解释: -u root,是指定用户,指定修改root用户的密码. -p password 是密码选项,其后面的newpasswd即为新的密码. 3.执行结果: [[email protected] 桌面]# mysqladmin