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'

 

posted @ 2014-11-19 01:13  Arvin Miao  阅读(196)  评论(0)    收藏  举报