Mysql 配置篇

所有配置都可以通过show variables获取, 所有的配置和默认的一些设置都可以称为Mysql变量. 只是作用域的范围不一样而已, 配置分为动态和静态两种,动态意味着你可以在Mysql运行中修改,静态表示在Mysql整个生命周期都是内都是不能修改的. 可以使用set对动态参数进行设置.

动态参数
@@session 表示当前回话
@@global 表示全局的

设置用户变量

set @test=1,@test2=2;

设置系统变量, 当针对当前mysql的生命周期生效

set @@session.read_buffer_size=51288;
set @@global.read_buffer_size=51288;

global 的修改会对全局生命,但不会覆盖mysql的配置文件,如果配置文件中有该配置那么该配置的优先级在一起global的设置,每个生命周期都是以配置中为的优先级最大.

静态参数
比如datadir这个参数就是只读的.

查询

select @@session.read_buffer_size  #当前生命周期的read_buffer_size
select @@global.read_buffer_size   #全局的read_buffer_size

内存配置
InnoDB存储引擎内存由有几个组成部分:

缓冲池 buffer pool(innodb_buffer_pool_size)

缓冲池是占最大块内存的部分,用来存放各种数据的缓存。因为InnoDB的存储引擎的工作方式总是将数据库文件按页(每页16K)读取到缓冲池,然后按最近最少使用(LRU)的算法来保留在缓冲池中的缓存数据。如果数据库文件需要修改,总是首先修改在缓存池中的页(发生修改后,该页即为脏页),然后再按照一定的频率将缓冲池的脏页刷新(flush)到文件。可以通过命令SHOW ENGINE INNODB STATUS来查看innodb_buffer_ pool的具体使用情况

innodb_buffer_pool_size 一般设置多大?
查看innodb过去时间范围内的的状态,查看Buffer pool size大小, Buffer pool size * 16 / 1024 = 要设置的大小

mysql > show engine innodb status\G; 

查看配置大小

show variables like 'innodb_buffer_pool_size';

重做日志缓冲池 redo log buffer(innodb_log_pool_size)

日志缓冲将重做日志信息先放入这个缓冲区,然后按一定频率将其刷新到重做日志文件。该值一般不需要设置为很大,因为一般情况下每一秒钟就会将重做日志缓冲刷新到日志文件,因此我们只需要保证每秒产生的事务量在这个缓冲大小之内即可。

额外的内存池 additional memory pool (innodb_additional_mem_pool_size)

额外的内存池通常被DBA忽略,认为该值并不是十分重要,但恰恰相反的是,该值其实同样十分重要。在InnoDB存储引擎中,对内存的管理是通过一种称为内存堆(heap)的方式进行的。在对一些数据结构本身分配内存时,需要从额外的内存池中申请,当该区域的内存不够时,会从缓冲池中申请。InnoDB实例会申请缓冲池(innodb_buffer_pool)的空间,但是每个缓冲池中的帧缓冲(frame buffer)还有对应的缓冲控制对象(buffer control block),而且这些对象记录了诸如LRU、锁、等待等方面的信息,而这个对象的内存需要从额外内存池中申请。因此,当你申请了很大的InnoDB缓冲池时,这个值也应该相应增加。

自动哈希索引

Innodb_adaptive_hash_index 用于启用或者禁用自适应hash索引

innodb_fast_shutdown

Innodb_fast_shutdown 参数告诉innodb在它关闭的时候该做什么工作,innodb_fast_shutdown影响着innodb表的行为,该参数有0,1,2三个值可以选择:
0表示在innodb关闭的时候,需要purge all, merge insert buffer,flush dirty pages。这是最慢的一种关闭方式,但是restart的时候也是最快的。
1表示在innodb关闭的时候,它不需要purge all,merge insert buffer,只需要flush dirty page,在缓冲池中的一些数据脏页会刷新到磁盘。(默认参数)
2表示在innodb关闭的时候,它不需要purge all,merge insert buffer,也不进行flush dirty page,只将log buffer里面的日志刷新到日志文件log files,MySQL下次启动时,会执行恢复操作。

innodb_force_recovery

innodb_force_recovery影响整个InnoDB存储引擎的恢复状况。默认为0(设置范围1-6),表示当需要恢复时执行所有的
恢复操作。当不能进行有效的恢复操作时,mysql有可能无法启动,并记录下错误日志。
1. 1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
2. 2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
3. 3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
4. 4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
5. 5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
6. 6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

mysql 位置

查看my.cnf位置

$ mysql --help | grep my.cnf

查看mysql data_dir位置

$ ps -ef | grep mysqld

或者

$ show variables like 'datadir';

用PHP实现一个简单的环形队列

缺少一个好的计时器. 但是功能能正常运行. 替换成一个好的计时器。状态可以保存在DB中.

/**
 * 环型队列.
 * 创建一个环形为3000个元素.
 * 作cron,其中每秒走一个位置.
 */

/**
 * Class Task
 */
class Task
{

    private $TaskId;
    private $Time;
    private $CallBack;
    private $Run;

    public function __construct($TaskId = null, $Time = null, $CallBack = null)
    {
        $this->Run = FALSE;
        $this->SetId($TaskId);
        $this->SetTime($Time);
        $this->SetCallback($CallBack);
    }

    public function SetId($TaskId)
    {
        $this->TaskId = $TaskId;
    }

    public function GetId()
    {
        return $this->TaskId;
    }

    public function SetTime($Time)
    {
        $this->Time = $Time;
    }

    public function GetTime()
    {
        return $this->Time;
    }

    public function SetCallBack($CallBack)
    {
        $this->CallBack = $CallBack;
    }

    public function GetCallBack()
    {
        return $this->CallBack;
    }

    public function Run()
    {
        if (!$this->Run && is_callable($this->GetCallBack())) {
            $this->Run = TRUE;
            $this->GetCallBack();
        }
    }
}

/**
 * Class Mqueue
 *
 * 3000的环形队列.
 *
 */
class Mqueue
{
    private $Queue;
    private $Tasks;
    private $CurrentTask;
    private $QueueLenth = 3000;
    private $CurrentIndex; // 当前为在哪个格子里面.
    private $CurrentNum;  // 当前在第几圈.

    /**
     * Add task.
     *
     */
    public function AddTask(Task $task)
    {
        $this->Tasks[$task->GetId()] = $task;
        $this->CurrentTask = $task->GetId();
        $this->SetQueue($task);
    }

    /**
     * 将任务添加到环中.
     *
     * @param $task
     */
    private function SetQueue($task)
    {
        $postion = $this->GetPosition($task);
        $this->Queue[$postion[1]][$postion[0]][$task->GetId()] = $task;
    }

    /**
     * 计算任务在当前哪个环中.
     *
     * @param $task
     *
     * @return array
     */
    private function GetPosition($task)
    {
        $time = strtotime($task->GetTime()) - time();

        return [
          $time % $this->QueueLenth,
          $this->CurrentNum + floor($time / $this->QueueLenth),
        ];
    }

    private function Timer()
    {
        $this->CurrentIndex = 0;
        $this->CurrentNum = 0;
        $this->Ring();
    }

    public function GetQueue() {
        return $this->Queue;
    }

    /**
     * @TODO Good timer.
     */
    private function Ring() {
        // 每秒跑一格.
        // 到尾了跑第二环.
        for($i = 0; $i <= $this->QueueLenth; $i++) {
            $this->CurrentIndex++;
            if(isset($this->Queue[$this->CurrentNum][$this->CurrentIndex])) {
                $this->Queue[$this->CurrentNum][$this->CurrentIndex]->Run();
            }
            sleep(1000);

            if($this->CurrentIndex <= $this->QueueLenth) {
                $this->CurrentNum++;
                $this->Ring();
            }

        }
    }
}

$task = new Task('thisismyfirsttask', '2017-3-21', function () {
        echo 'hello world';
    }
);

$mq = New Mqueue();
$mq->AddTask($task);
print_r($mq->GetQueue());

Drupal 7 rewrite settings.php

/**
 * Form callback.
 *
 * @param $form
 * @param $form_state
 */
function myform_submit(&$form, &$form_state) {

  global $databases;

  // Update settings.php.
  $inputs = $form_state['input'];

  require_once DRUPAL_ROOT . '/includes/install.inc';

  $settings['databases'] = array(
    'value'    => array('default' => array(
      'default' => $databases['default']['default'],
      'odbc' => array (
        'database' => $inputs['olm_mart_db_name'],
        'username' => $inputs['olm_mart_db_user'],
        'password' => $inputs['olm_mart_db_pass']['pass1'],
        'host' => $inputs['olm_mart_db_host'],
        'port' => $inputs['olm_mart_db_port'],
        'driver' => 'odbc',
        'prefix' => '',
      ),
    )),
    'required' => TRUE,
  );

  //  $settings['drupal_hash_salt'] = array(
  //    'value'    => drupal_random_key(),
  //    'required' => TRUE,
  //  );
  drupal_rewrite_settings($settings);
}

Docker configuration nginx,php7,mysql

Download php7, mysql, nginx

$ docker pull php:7-fpm-alpine
$ docker pull nginx
$ docker pull mysql

Run php

在这里必须挂载目录到php-fpm, nginx不会直接执行,它检测到php文件,会把php文件的路径发到php-fpm去,php-fpm再依据nginx发过来的路径找到代码并执行啊。

$ docker run -it --rm --name xphp --link xmysql:xmysql -v /Users/zhouitpro/www/docker_web:/usr/share/nginx/html php:7-fpm-alpine
# --link xmysql:xmysql 映射mysql

Install php ext

# 安装pdo_mysql
$ docker exec -it run xphp bash
Docker# docker-php-ext-install pdo_mysql
Docker# docker-php-ext-enable pdo_mysql

Run Nginx

nginx config file

server {
    listen       80;
    server_name  localhost;
    root /usr/share/nginx/html/;
    location ~ \.php$ {
        fastcgi_pass xphp:9000; # 这里对应上面的php-fpm别名, php-fpm端口默认是9000
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    location ~ /\.ht {
        deny  all;
    }
}
$ docker run -it --rm  --link xphp:xphp -v /Users/zhouitpro/www/docker_web:/usr/share/nginx/html  -v /Users/zhouitpro/www/docker/site.conf:/etc/nginx/conf.d/default.conf -p 9090:80  nginx

# -p 是转发端口 外部的 9090对应nginx提供的80端口
# --link 是映射上面的 php-fpm
# -v 是映射本地的web目录到nginx的www目录,和配置文件

Mysql

$ docker run -it --rm --name xmysql -e MYSQL_ROOT_PASSWORD=root mysql

HHVM

hhvm

$ brew install hhvm

安装Supervisord, 用于监控Supervisord并且可以自动重启hhvm当hhvm崩溃的时候

$ sudo easy_install supervisor
$ mkdir -p /usr/local/etc/supervisor.d/

Capistrano 自动部署

Install

$ gem install capistrano
$ cap install #初始化
$ cap production deploy #部署到在线
$ cap production deploy:rollback #回滚

config/deploy.rb
:application 应用名
:repo_url 远程仓库地址
:deploy_to 服务器目录

其它工具:
Deployer
Magallanes
Rocketeer