MySQL多实例安装配置指南
目录
MySQL多实例安装配置指南... 1
1.1 MySQL多实例介绍... 2
1.1.1什么是MySQL多实例?... 2
1.1.2多实例的作用与问题... 2
1.2多实例生产应用场景... 3
1.2.1资金紧张型公司的选择... 3
1.2.2并发访问不是很大的业务... 3
1.2.3门户网站应用MySQL多实例场景... 3
1.3 MySQL多实例常见配置方案... 3
1.3.1 多配置文件部署方案... 3
1.3.2 MySQL数据库... 4
1.3.3 MariaDB数据库... 4
1.3.4 SqlServer数据库... 4
1.3.5 Access数据库... 5
1.3.6 其他不常用数据库... 5
1.4 常用非关系型数据库产品介绍... 5
1.4.1 Memcached(key-value)... 5
1.4.2 Redis(key-value)... 6
1.4.3 MongoDB(Document-oriented)... 7
1.4.4 Cassandra(Column-oriented)... 7
1.4.5 其他不常用非关系型数据库... 7
1.5 数据库相关知识... 7
1.5.1数据库软件企业应用排名参考... 7
1.1 MySQL多实例介绍
1.1.1什么是MySQL多实例?
简单的说,就是在一台机器上开启多个不同的端口,运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口开提供各自的服务。
这些MySQL多实例公用一套MySQL安装程序,使用不同的my.cnf配置文件、启动程序,数据文件。在提供服务时,多实例MySQL在逻辑上看来是各自独立的,多个实例的自身是根据配置文件对应的设定值,来取得服务器的相关硬件资源多少。
做个比喻,MySQL多实例相当于房子的多个卧室一样,每个实例可以看成是一间卧室,整个服务器就是一套房子。服务器硬件资源就像是房子里的客厅,餐厅,厨房一样,是房子的公共资源。
1.1.2多实例的作用与问题
1.1.2.1、有效利用服务器资源
当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务。
1.1.2.2、节约服务器资源
当公司服务器紧张,但是数据库又需要各自尽量独立提供服务,而且,需要主从同步技术时,多实例就再好不过了。
1.1.2.3、资源互相抢占问题
当某个服务实例并发很高或者有慢查询时,整个实例会消耗更多的内存、CPU、磁盘IO资源,导致服务器上的其它的实例提供服务的质量下降。这就相当于大家住在一个房子的不同卧室,早上起床洗脸刷牙,卫生间被一个人长期占用,其他人需要等待是一样的道理。
1.2多实例生产应用场景
1.2.1资金紧张型公司的选择
当公司业务访问量不太大,又舍不得花钱,但是希望不同的业务的数据库服务各自尽量独立的提供服务互相不受影响,而且,需要主从同步进行备份或者读写分离服务时,多实例就再好不过了。比如:通过3台服务器部署6-9个实例,交叉做主从不同和读写分离。
1.2.2并发访问不是很大的业务
当公司业务访问量不太大的时候,服务器资源基本都是浪费的,这时就很适合多实例的应用,如果对SQL语句优化做的比较好,MySQL多实例是一个很值得使用的技术,即使并发很大,合理分配好系统资源,也不会有太大问题。
1.2.3门户网站应用MySQL多实例场景
某搜索引擎的数据库就是多实例,一般是从库,内存96G,跑3-4个实例。某微博也是用多实例,内存48G左右。门户网站使用多实例的目的是配硬件好的服务器,节省IDC机柜空间,同时,跑多实例让硬件资源不浪费。
1.3 MySQL多实例常见配置方案
1.3.1 多配置文件部署方案
通过配置多个配置文件及多个启动程序来实现多实例的方案。配置:
[root@Arvin02 data]# tree /data/
/data/
|-- 3306
| |-- data
| |-- my.cnf
| `-- mysql
|-- 3307
| |-- data
| |-- my.cnf
| `-- mysql
`-- 3308
|-- data
|-- my.cnf
`-- mysql
6 directories, 6 files
提示:配置文件,启动程序,数据文件分别独立的。
1.3.2 单一配置文件方案
1)、my.cnf配置文件样例(mysql手册第五章样例)
【mysqld_multi】
Mysqld=/usr/bin/mysqld_safe
Mysqladmin=/usr/bin/mysqladmin
User=mysql
# options for mysqld1 service
[mysqld1]
socket = /var/lib/mysql/mysql.sock
port = 3307
pid-file=/var/lib/mysql/mysqld.pid
datadir=/var/lib/mysql/
user=mysql
[mysqld2]
socket = /mnt/data/db1/mysql.sock
port = 3308
pid-file=/mnt/data/db1/mysqld.pid
datadir=/mnt/data/db1/
user=mysql
skip-name-resolve
server-id=10
default-storage-engine=innodb
innodb_buffer_pool_size=512M
innodb_additional_mem_pool=10M
default_character_set=utf8
character_set_server=utf8
relay_log_space-limit=3G
expire_logs_day=20
2)、启动方法
Mysqld_multi –-config-file=/data/mysql/my_multi.cnf start 1,2
3)、缺点耦合性太高
1.4 安装多实例MySQL数据库
1.4.1 建立MySQL多实例条件
(1)、安装好MySQL安装依赖的包
Yum install ncurses-devel –y
Yum install libaio-devel –y
(2)选择二进制按章方式为例
按照四种MySQL安装方式之一安装好数据库,如果是编译安装在,则到make install之后截止。
1.4.2 建立MySQL账号
[root@Arvin02 /]# groupadd mysql
[root@Arvin02 /]# useradd -s /sbin/nologin -g mysql -M mysql
参数说明:
-s /sbin/nologin:表示禁止该用户登录
-g mysql :指定数据mysql组。
-M 表示不创建家目录。
检查用户:
[root@Arvin02 /]# tail -l /etc/passwd
mysql:x:500:500::/home/mysql:/sbin/nologin
1.4.3获取MySQL软件
通过rz或sftp等命令从本地上传MySQL软件包到Linux服务器,名称如:mysql-5.5.32-linux2.6-x86_64.tar.gz,也可以从网站上找到地址,通过wget方式下载。
上传软件如下:
(1)、建立MySQL软件包目录
[root@Arvin02 /]#mkdir -p /home/arvin/tools
[root@Arvin02 /]#cd /home/arvin/tools
(2)、查看上传后的MySQL二进制软件包
[root@Arvin02 /]#ls mysql-5.5.32-linux2.6-x86_64.tar.gz
[root@Arvin02 /]#mysql-5.5.32-linux2.6-x86_64.tar.gz
1.4.4安装MySQL软件
(1)、解压软件包,移动到规范的软件安装目录下
[root@Arvin02 /]#tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz
[root@Arvin02 /]#mkdir –p /application/
[root@Arvin02 /]#mv mysql-5.5.32-linux2.6-x86_64 /application/mysql-5.5.32
(2)、生成不带版本号的软连接/application/mysql,即MySQL安装路径
[root@Arvin02 /]#ln -s /application/mysql-5.5.32 /application/mysql
1.4.5 创建MySQL多实例的数据文件目录
本案例采用的是/data目录作为musql多实例总根目录,然后规划不同的MySQL实例端口号来作为/data下面的二级目录,不同的端口号就是不同的实例目录,以区别不同的实例,二级目录下包含mysql数据文件,配置文件以及启动文件的目录。
(1)、创建相关mysql多实例的目录如下
[root@Arvin02 /]# mkdir -p /data/{3306,3307}/data
[root@Arvin02 /]# tree /data/
/data/
|-- 3306
| `-- data
`-- 3307
`-- data
4 directories, 0 files
1.4.6 创建MySQL多实例的配置文件
MySQL数据库默认用户提供多个配置文件模板,用户可以根据硬件配置大小来选择。
我们可以通过vi命令来添加,如下:
Vi /data/3306/my.cnf
Vi /data/3306/my.cnf
需要添加的my.cnf内容见表,(由官方配置模板修改而来)当然,在实际工作中我们是拿配置好的模板来进行修改,可以通过rz等方式上传配置文件模板my.cnf文件到相关目录下。
|
3306 |
3307 |
|
[client] port = 3306 socket = /data/3306/mysql.sock
[mysql] no-auto-rehash
[mysqld] user = mysql port = 3306 socket = /data/3306/mysql.sock basedir = /application/mysql datadir = /data/3306/data open_files_limit = 1024 back_log = 600 max_connections = 800 max_connect_errors = 3000 table_cache = 614 external-locking = FALSE max_allowed_packet =8M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 100 thread_concurrency = 2 query_cache_size = 2M query_cache_limit = 1M query_cache_min_res_unit = 2k #default_table_type = InnoDB thread_stack = 192K #transaction_isolation = READ-COMMITTED tmp_table_size = 2M max_heap_table_size = 2M long_query_time = 1 #log_long_format #log-error = /data/3306/error.log #log-slow-queries = /data/3306/slow.log pid-file = /data/3306/mysql.pid log-bin = /data/3306/mysql-bin relay-log = /data/3306/relay-bin relay-log-info-file = /data/3306/relay-log.info binlog_cache_size = 1M max_binlog_cache_size = 1M max_binlog_size = 2M expire_logs_days = 7 key_buffer_size = 16M read_buffer_size = 1M read_rnd_buffer_size = 1M bulk_insert_buffer_size = 1M #myisam_sort_buffer_size = 1M #myisam_max_sort_file_size = 10G #myisam_max_extra_sort_file_size = 10G #myisam_repair_threads = 1 #myisam_recover
lower_case_table_names = 1 skip-name-resolve slave-skip-errors = 1032,1062 replicate-ignore-db=mysql
server-id = 1
innodb_additional_mem_pool_size = 4M innodb_buffer_pool_size = 32M innodb_data_file_path = ibdata1:128M:autoextend innodb_file_io_threads = 4 innodb_thread_concurrency = 8 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 4M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 0 [mysqldump] quick max_allowed_packet = 2M
[mysqld_safe] log-error=/data/3306/mysql_oldboy3306.err pid-file=/data/3306/mysqld.pid |
[client] port = 3307 socket = /data/3307/mysql.sock
[mysql] no-auto-rehash
[mysqld] user = mysql port = 3307 socket = /data/3307/mysql.sock basedir = /application/mysql datadir = /data/3307/data open_files_limit = 1024 back_log = 600 max_connections = 800 max_connect_errors = 3000 table_cache = 614 external-locking = FALSE max_allowed_packet =8M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 100 thread_concurrency = 2 query_cache_size = 2M query_cache_limit = 1M query_cache_min_res_unit = 2k #default_table_type = InnoDB thread_stack = 192K #transaction_isolation = READ-COMMITTED tmp_table_size = 2M max_heap_table_size = 2M #long_query_time = 1 #log_long_format #log-error = /data/3307/error.log #log-slow-queries = /data/3307/slow.log pid-file = /data/3307/mysql.pid #log-bin = /data/3307/mysql-bin relay-log = /data/3307/relay-bin relay-log-info-file = /data/3307/relay-log.info binlog_cache_size = 1M max_binlog_cache_size = 1M max_binlog_size = 2M expire_logs_days = 7 key_buffer_size = 16M read_buffer_size = 1M read_rnd_buffer_size = 1M bulk_insert_buffer_size = 1M #myisam_sort_buffer_size = 1M #myisam_max_sort_file_size = 10G #myisam_max_extra_sort_file_size = 10G #myisam_repair_threads = 1 #myisam_recover
lower_case_table_names = 1 skip-name-resolve slave-skip-errors = 1032,1062 replicate-ignore-db=mysql
server-id = 3
innodb_additional_mem_pool_size = 4M innodb_buffer_pool_size = 32M innodb_data_file_path = ibdata1:128M:autoextend innodb_file_io_threads = 4 innodb_thread_concurrency = 8 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 4M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 0 [mysqldump] quick max_allowed_packet = 2M
[mysqld_safe] log-error=/data/3307/mysql_oldboy3307.err pid-file=/data/3307/mysqld.pid |
最终完成的结果如下:
[root@Arvin02 tools]# tree /data/
/data/
|-- 3306
| |-- data
| `-- my.cnf
`-- 3307
|-- data
`-- my.cnf
4 directories, 2 files
1.4.7 创建MySQL多实例的启动文件
启动文件的创建,和配置文件创建几乎一样,也可以通过vi命令来添加,如下:
Vi /data/3306/mysql
Vi /data/3307/mysql
需要添加的mysqld启动文件内容见下表,当然,在实际工作中我们是拿配置好的模板来进行修改,可以通过rz等方式上传到相关目录下。
|
3306 mysql |
3307 mysql |
|
#!/bin/sh #init port=3306 mysql_user="root" mysql_pwd="oldboy" CmdPath="/application/mysql/bin" mysql_sock="/data/${port}/mysql.sock" #startup function function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null & else printf "MySQL is running...\n" exit fi }
#stop function function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit else printf "Stoping MySQL...\n" ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown fi }
#restart function 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: /data/${port}/mysql {start|stop|restart}\n" esac |
#!/bin/sh #init port=3307 mysql_user="root" mysql_pwd="oldboy" CmdPath="/application/mysql/bin" mysql_sock="/data/${port}/mysql.sock" #startup function function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null & else printf "MySQL is running...\n" exit fi }
#stop function function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit else printf "Stoping MySQL...\n" ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown fi }
#restart function 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: /data/${port}/mysql {start|stop|restart}\n" esac |
最终结构如下:
[root@Arvin02 tools]# tree /data/
/data/
|-- 3306
| |-- data
| |-- my.cnf
| `-- mysql
`-- 3307
|-- data
|-- my.cnf
`-- mysql
4 directories, 4 files
多实例启动文件启动mysql服务实质:
mysqld_safe –defaults-file=/data/3306/my.cnf 2>&1 >/dev/null &
mysqld_safe –defaults-file=/data/3307/my.cnf 2>&1 >/dev/null &
多实例启动文件的停止mysql服务实质:
mysqladmin –u root –pmysql –S /data/3306/mysql.sock shutdown
mysqladmin –u root –pmysql –S /data/3307/mysql.sock shutdown
1.4.8 配置mysql多实例的文件权限
授权mysql用户和组管理整个多实例目录/data
[root@Arvin02 tools]# chown -R mysql.mysql /data
[root@Arvin02 tools]# find /data -name mysql
/data/3307/mysql
/data/3306/mysql
授权mysql多实例服务所有的启动文件mysql可执行
[root@Arvin02 tools]# find /data/ -type f -name "mysql"|xargs ls -l
-rw-r--r--. 1 mysql mysql 1307 Nov 18 23:55 /data/3306/mysql
-rw-r--r--. 1 mysql mysql 1307 Nov 18 23:55 /data/3307/mysql
[root@Arvin02 tools]# find /data/ -type f -name "mysql"|xargs chmod +x
[root@Arvin02 tools]# find /data/ -type f -name "mysql"|xargs ls -l
-rwxr-xr-x. 1 mysql mysql 1307 Nov 18 23:55 /data/3306/mysql
-rwxr-xr-x. 1 mysql mysql 1307 Nov 18 23:55 /data/3307/mysql
检查结果:
[root@Arvin02 tools]# ls -ld /data/
drwxrwxrwx. 4 mysql mysql 4096 Nov 18 23:16 /data/
[root@Arvin02 tools]# ls -l /data/
total 8
drwxr-xr-x. 3 mysql mysql 4096 Nov 18 23:55 3306
drwxr-xr-x. 3 mysql mysql 4096 Nov 18 23:55 3307
[root@Arvin02 tools]# ls -l /data/{3306,3307}/
/data/3306/:
total 12
drwxr-xr-x. 2 mysql mysql 4096 Nov 18 23:16 data
-rw-r--r--. 1 mysql mysql 1899 Nov 18 23:31 my.cnf
-rwxr-xr-x. 1 mysql mysql 1307 Nov 18 23:55 mysql
/data/3307/:
total 12
drwxr-xr-x. 2 mysql mysql 4096 Nov 18 23:16 data
-rw-r--r--. 1 mysql mysql 1901 Nov 18 23:31 my.cnf
-rwxr-xr-x. 1 mysql mysql 1307 Nov 18 23:55 mysql
1.4.9 配置mysql命令全局使用路径
1.4.9.1配置全局路径意义
如果不胚子mysql命令全局路径,就无法直接写mysql等命令,也就是只能/usr/local/mysql/bin/mysql 这样写命令。
1.4.9.2配置全局路径方法
方法一、
[root@Arvin02 mysql-5.1.72]#echo ‘export PATH=/application/mysql/bin/:$PATH’ >>/etc/profile
[root@Arvin02 mysql-5.1.72]# source /etc/profile
#执行source使上一行添加到/etc/profile中,内容直接生效。
方法二、
把/usr/local/mysql/bin下面的命令拷贝到全局系统命令路径/usr/local/sbin也可:
[root@Arvin02 mysql-5.1.72]# /bin/cp /usr/local/mysql/bin/* /usr/local/sbin/
1.4.9.3配置全局路径方法
1.4.10 初始化MySQL多实例的数据库文件
(1)、初始化命令为
Mysql5.1.X初始化命令:
cd /application/mysql/bin/
mysql_install_db –basedir=/application/mysql –datadir=/data/3306/data –user=mysql
mysql_install_db –basedir=/application/mysql –datadir=/data/3307/data –user=mysql
Mysql5.5.X初始化命令:
cd /application/mysql/scripts/
./mysql_install_db –basedir=/application/mysql –datadir=/data/3306/data –user=mysql
./mysql_install_db –basedir=/application/mysql –datadir=/data/3307/data –user=mysql
(2)、操作过程如下
mysql_install_db --user=mysql
提示:如果mysql5.5版本,即使是单实例,也无法使用mysql_install_db=musql初始化数据库,可以指定目录安装。
如:mysql_install_db –datadir=/data/3306/data --user=mysql
(3)、为什么初始化数据库?
a、初始化的主要目的就是创建基础的数据库文件,例如:生成mysql库表等。
b、初始化后产看对应实例数据目录,可以看到如下文件。
[root@Arvin02 bin]# tree /data/3306/data/
/data/3306/data/
|-- mysql
| |-- columns_priv.MYD
| |-- columns_priv.MYI
| |-- columns_priv.frm
| |-- db.MYD
| |-- db.MYI
| |-- db.frm
| |-- event.MYD
| |-- event.MYI
| |-- event.frm
| |-- func.MYD
| |-- func.MYI
| |-- func.frm
| |-- general_log.CSM
| |-- general_log.CSV
| |-- general_log.frm
| |-- help_category.MYD
| |-- help_category.MYI
| |-- help_category.frm
| |-- help_keyword.MYD
| |-- help_keyword.MYI
| |-- help_keyword.frm
| |-- help_relation.MYD
| |-- help_relation.MYI
| |-- help_relation.frm
| |-- help_topic.MYD
| |-- help_topic.MYI
| |-- help_topic.frm
| |-- host.MYD
| |-- host.MYI
| |-- host.frm
| |-- ndb_binlog_index.MYD
| |-- ndb_binlog_index.MYI
| |-- ndb_binlog_index.frm
| |-- plugin.MYD
| |-- plugin.MYI
| |-- plugin.frm
| |-- proc.MYD
| |-- proc.MYI
| |-- proc.frm
| |-- procs_priv.MYD
| |-- procs_priv.MYI
| |-- procs_priv.frm
| |-- servers.MYD
| |-- servers.MYI
| |-- servers.frm
| |-- slow_log.CSM
| |-- slow_log.CSV
| |-- slow_log.frm
| |-- tables_priv.MYD
| |-- tables_priv.MYI
| |-- tables_priv.frm
| |-- time_zone.MYD
| |-- time_zone.MYI
| |-- time_zone.frm
| |-- time_zone_leap_second.MYD
| |-- time_zone_leap_second.MYI
| |-- time_zone_leap_second.frm
| |-- time_zone_name.MYD
| |-- time_zone_name.MYI
| |-- time_zone_name.frm
| |-- time_zone_transition.MYD
| |-- time_zone_transition.MYI
| |-- time_zone_transition.frm
| |-- time_zone_transition_type.MYD
| |-- time_zone_transition_type.MYI
| |-- time_zone_transition_type.frm
| |-- user.MYD
| |-- user.MYI
| `-- user.frm
`-- test
2 directories, 69 files
1.4.11 启动MySQL多实例数据库
启动命令为
[root@Arvin02 bin]# /data/3306/mysql start
Starting MySQL...
[root@Arvin02 bin]# /data/3307/mysql start
Starting MySQL...
检查MySQL数据库是否启动
[root@Arvin02 bin]# netstat -lntup|grep 330
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 2807/mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2568/mysqld
1.4.12 MySQL多实例数据库管理方法
MySQL安装完成后,默认情况下,管理员账号root是无密码的。登录不同库需要指定不同库的sock路径,这个实在my.cnf里指定的。
1、登录数据库
mysql –S /data/3306/mysql.sock
mysql –S /data/3307/mysql.sock
2、重启数据库
/data/3306/mysql stop
/data/3306/mysql start
1.5 mysql安全配置
1.5.1、为root添加密码
mysqladmin -u root -S /data/3306/mysql.sock password 'mysql123'
mysqladmin -u root -S /data/3307/mysql.sock password 'mysql123'

浙公网安备 33010602011771号