一、多实例的应用场景:

1、资金紧张型公司的选择

当公司业务访问量不太大,又舍不得花钱,但同时又希望不同业务的数据库服务各自独立,而且需要主从同步进行等技术提供备份或读写分离服务时,使用多实例是最好不过的。

2、并发访问不是特别大的业务

当公司业务访问量不太大,服务器资源基本闲置的比较多,这是就很适合多实例的应用。如果对SQL语句优化的好,多实例是一个很值得使用的技术。即使并发很大,只要合理分配好系统资源,也不会有太大问题。

二、mysql多实例的原理


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

这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间根据配置文件的设定值,来取得服务器的相关硬件资源。


三、多实例部署步骤

在这里数据库的编译安装就不赘述了,如有不清楚的,请参考其他文件。

实验使用的端口:33064,33065


1、创建数据目录

创建数据文件存放目录,并修改文件夹的所属用户组

mkdir -p /home/mysqldata/33064

mkdir -p /home/mysqldata/33065

chown mysql.mysql 33064/33065/

2、初始化数据库:


/usr/bin/mysql_install_db\

--datadir=/home/mysqldata/33064/\

--user=mysql

 

/usr/bin/mysql_install_db\

--datadir=/home/mysqldata/33065/\

--user=mysql


3、配置/etc/my.cnf配置文件

每一个实例都有一个属于实例自己的msyqld模块,模块中是实例对应的初始化参数,例如[mysqld33064],[mysqld33065]


[root@model /]# cat /etc/my.cnf

[mysqld_multi]

mysqld=/usr/bin/mysqld_safe

mysqladmin=/usr/bin/mysqladmin

user=mysql

password=mysql

 

[mysqld33064]

datadir=/home/mysqldata/33064

port=33064

socket=/home/mysqldata/33064/mysql33064.sock

user=mysql

symbolic-links=0

default-storage-engine=INNODB

log-bin = mysql-bin

binlog_format = mixed

expire_logs_days = 7

## utf8

#default-character-set = utf8

#character_set_connection = utf8

#character_set_results = utf8

character-set-server = utf8

collation-server = utf8_general_ci

init_connect = 'SET collation_connection =utf8_general_ci '

init_connect = 'SET NAMES utf8'

server-id = 1

 

[mysqld33065]

datadir=/home/mysqldata/33065

port=33065

socket=/home/mysqldata/33065/mysql33065.sock

user=mysql

symbolic-links=0

default-storage-engine=INNODB

log-bin = mysql-bin

binlog_format = mixed

expire_logs_days = 7

## utf8

#default-character-set = utf8

#character_set_connection = utf8

#character_set_results = utf8

character-set-server = utf8

collation-server = utf8_general_ci

init_connect = 'SET collation_connection =utf8_general_ci '

init_connect = 'SET NAMES utf8'

server-id = 1

[mysqld_safe]

#log=/var/log/mysqldquery.log

## error log

log-error=/var/log/mysqld.log

#pid-file=/var/run/mysqld/mysqld.pid


4、多实例的启动和停止

启动的时候要用mysqld_multi 命令,而不是mysqld命令,命令通过传递不同的端口参数来启动对应额数据库实例.

/usr/bin/mysqld_multi  --defaults-file=/etc/my.cnf start 33064

/usr/bin/mysqld_multi --defaults-file=/etc/my.cnf  start  33065

 

/usr/bin/mysqld_multi --defaults-file=/etc/my.cnf stop  33064

/usr/bin/mysqld_multi --defaults-file=/etc/my.cnf stop  33065

查看数据库进程情况,如果有两个数据库进程说明数据库安装正常,否则失败,具体原因需要查看log日志来处理。

[root@model mysql]# ps -ef|grep mysql

root      3990     1  0 11:18 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/home/mysqldata/33065 --port=33065 --socket=/home/mysqldata/33065/mysql33065.sock --user=mysql --symbolic-links=0 --default-storage-engine=INNODB --log-bin=mysql-bin --binlog_format=mixed --expire_logs_days=7 --character-set-server=utf8 --collation-server=utf8_general_ci --init_connect=SET collation_connection = utf8_general_ci  --init_connect=SET NAMES utf8 --server-id=1

mysql     4132  3990  0 11:18 pts/0    00:00:01 /usr/libexec/mysqld --basedir=/usr --datadir=/home/mysqldata/33065 --user=mysql --symbolic-links=0 --default-storage-engine=INNODB --log-bin=mysql-bin --binlog_format=mixed --expire_logs_days=7 --character-set-server=utf8 --collation-server=utf8_general_ci --init_connect=SET collation_connection = utf8_general_ci  --init_connect=SET NAMES utf8 --server-id=1 --log-error=/var/log/mysqld.log --pid-file=/home/mysqldata/33065/model.pid --socket=/home/mysqldata/33065/mysql33065.sock --port=33065

root      4155     1  0 11:18 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/home/mysqldata/33064 --port=33064 --socket=/home/mysqldata/33064/mysql33064.sock --user=mysql --symbolic-links=0 --default-storage-engine=INNODB --log-bin=mysql-bin --binlog_format=mixed --expire_logs_days=7 --character-set-server=utf8 --collation-server=utf8_general_ci --init_connect=SET collation_connection = utf8_general_ci  --init_connect=SET NAMES utf8 --server-id=1

mysql     4297  4155  0 11:18 pts/0    00:00:01 /usr/libexec/mysqld --basedir=/usr --datadir=/home/mysqldata/33064 --user=mysql --symbolic-links=0 --default-storage-engine=INNODB --log-bin=mysql-bin --binlog_format=mixed --expire_logs_days=7 --character-set-server=utf8 --collation-server=utf8_general_ci --init_connect=SET collation_connection = utf8_general_ci  --init_connect=SET NAMES utf8 --server-id=1 --log-error=/var/log/mysqld.log --pid-file=/home/mysqldata/33064/model.pid --socket=/home/mysqldata/33064/mysql33064.sock --port=33064


5、多实例的连接登录


mysql -S /home/mysqldata/33064/mysql33064.sock

mysql -S /home/mysqldata/33065/mysql33065.sock


6、赋权限

刚安装好的数据库root用户无localhost登录权限,所以需要赋权限以后才能通过用户名和密码登录。

mysql -S /home/mysqldata/33064/mysql33064.sock

 

mysql>grant allon *.* to 'root'@'%' identified by 'root';

mysql>grant allon *.* to 'root'@'localhost' identified by 'root';

mysql> flushprivileges;

 7、通过用户名和密码登录

mysql -uroot -proot -S  /home/mysqldata/33064/mysql33064.sock

8、多实例修改密码

修改实例33064的root密码,使用mysqladmin命令。如下:

mysqladmin -uroot -p password root-S /home/mysqldata/33064/mysql33064.sock


到此我们的mysql多实例部署就已经完成。