[emerg]: could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 64
/etc/nginx/nginx.conf
http {
…
server_names_hash_bucket_size 512;
…
}
sadmin
MySQL е много бърза, стабилна система за управление на релационни бази данни (Relational Management Systems- RDBMS). Базата данни позволява ефективно съхранение, претърсване, сортиране и извличане на данни. MySQL контролира достъпа до вашите данни и позволява едновременна работа на множество потребители, бърз достъп, както и осигуряване на достъп само на оторизираните за това потребители. …
PS: Готин домейн за дрехи: dreha.bg
Идеята е да се открият какви dhcp сървъри има в мрежата.
dhcping -s 255.255.255.255 -r -v
Got answer from: 172.16.2.2
received from 172.16.2.2, expected from 255.255.255.255
Got answer from: 172.16.2.2
received from 172.16.2.2, expected from 255.255.255.255
no answer
Тук става ясно, че има един -- 172.16.2.2
При change master на mysql slave излиза следната грешка съпроводена с решение :) :
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 licenseType 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> CHANGE MASTER TO MASTER_HOST='192.193.123.4', MASTER_USER='slaveuser', MASTER_PASSWORD='pass', MASTER_LOG_FILE='mysql-bin.000020', MASTER_LOG_POS=49869;
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error logmysql> reset slave;
Query OK, 0 rows affected (0.00 sec)mysql> CHANGE MASTER TO MASTER_HOST='192.193.123.4', MASTER_USER='slaveuser', MASTER_PASSWORD='pass', MASTER_LOG_FILE='mysql-bin.000020', MASTER_LOG_POS=49869;
Query OK, 0 rows affected (0.02 sec)mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
Идяета е да се стартира mysqld които да предлага само четене без запис. Това е подходящо за репликиращи схеми и други.
Първи метод :
1.1
Със Superuser т.е. root сетвамее read_only=1 или read_only=yes
mysql-h localhost-u root-p
set GLOBAL read_only = true;
Със нормален потребител притежаващ пълни права върху конкретна база изпълняваме следната заявка:
mysql> insert into x (c) values ('test_mysql_read_only_by_amri');
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
За да активираме write правата на всеки нормален потребител(изключение е само root):
mysql-h localhost-u root-p
set GLOBAL read_only = false;
1.2
Във файл /etc/mysql/my.cnf и по- точно в секция [mysqld] се добавя:
[mysqld]
read_only=1/etc/init.d/mysql restart;
Втори метод за заключване на таблиците само за четене:
2.1
Отварят се две конзоли свързани към mysql. На втората се изпълнява(заключваме):
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.01 sec)
На първата конзола която също е свързана към mysql се прави опит за INSERT , но не става :)
За да се активира отново на втората конзола се изпълнява:
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
Идеята е да се обедини mysql-proxy + memcache. Защо ?
Защото искам всяка select заявка да се кешира в memcache. Ако не е кеширана да я кешира и при следващо извикване да я извлича от memcache.
Защо не се пусне само memcache и от самото php да се свързва към memcache демона ?
Защото по този метод (разгледана в публикацията) не се налага да се променя кода на писане т.е. просто се php приложението се свързва към localhost:4040 вместо към localhost (порта 4040 може да бъде променян разбира се, дори и на 3306 )
aptitude install lua5.1 liblua5.1-md5-0 liblua5.1-socket2 luarocks memcached mysql-proxy
mkdir /tmp/mysql-proxy-memcache-temp;
cd /tmp/mysql-proxy-memcache-temp;
wget http://luaforge.net/frs/download.php/4041/liblua5.1-memcached0.deb
wget http://luamemcached.googlecode.com/files/liblua5.1-memcached0.deb
wget http://luarocks.org/releases/luarocks-2.0.4.1.tar.gz
tar zxvf luarocks-2.0.4.1.tar.gz
./configure
make
make install;
luarocks install md5
cd /tmp/mysql-proxy-memcache-temp;
wget http://luaforge.net/frs/download.php/4542/luamemcached.0.7.tar.gz
tar xzvf luamemcached.0.7.tar.gz
mv *.lua /usr/local/share/lua/5.1/
luarocks install luasocket
cp mysql-proxy-cache.lua /usr/share/mysql-proxy/
mysql-proxy --proxy-lua-script=/usr/share/mysql-proxy/mysql-proxy-cache.lua
Код на mysql-proxy-cache.lua :
require('luarocks.require')
require('md5')
require('Memcached')
local memcache = Memcached.Connect()
cache_hits = 0
cache_misses = 0
cache_timeout = 30
function is_query(packet)
return packet:byte() == proxy.COM_QUERY
endfunction is_cacheable(query)
return query:sub(1,6):lower() == 'select'
endfunction to_hash(query)
db = proxy.connection.client.default_db
return md5.sumhexa(query..'db'..db)
endfunction cache_get(query)
db = proxy.connection.client.default_db
local result = deserialize(memcache:get(to_hash(query)))
if result then
print('HIT: '..to_hash(query)..' ('..query..') DB:'..db)
cache_hits = cache_hits + 1
else
print('MISS: '..to_hash(query)..' ('..query..') DB:'..db)
cache_misses = cache_misses + 1
endprint('Cache hit ratio: '..cache_hits..'/'..cache_misses..' = '..cache_hits/cache_misses..' DB:'..db)
return result
endfunction cache_set(result_packet)
local resultset_is_needed = false
local query = result_packet.query:sub(2)
local field_count = 1
local fields = result_packet.resultset.fields
local resultset = {rows={}, fields={}}print('SET: '..to_hash(query)..' ('..query..')')
while fields[field_count] do
local field = fields[field_count]
--added third option, expiry time.
table.insert(resultset.fields, {type=field.type, name=field.name} )
field_count = field_count + 1
endfor row in result_packet.resultset.rows do
table.insert(resultset.rows, row)
endmemcache:set(to_hash(query), serialize(resultset), cache_timeout)
endfunction serialize(o)
local result = {}
local o_type = type(o)if o_type == "number" then
table.insert(result, o)elseif o_type == "string" then
table.insert(result, string.format("%q", o))elseif o_type == "table" then
table.insert(result, "{")
for key, value in pairs(o) do
for i, str in pairs({"[", serialize(key), "]=",
serialize(value), ","}) do
table.insert(result, str)
end
end
table.insert(result, "}")elseif o_type == "nil" then
table.insert(result, "nil")else
error("cannot serialize a " .. o_type)
endreturn table.concat(result, ")
endfunction deserialize(s)
if s then
return loadstring('return '..s)()
else
return nil
end
endfunction read_query( packet )
if is_query(packet) then
local query = packet:sub(2)if is_cacheable(query) then
local resultset = cache_get(query)
if resultset then
--- Cache hit
proxy.response.type = proxy.MYSQLD_PACKET_OK
proxy.response.resultset = resultsetreturn proxy.PROXY_SEND_RESULT
else
--- Cache miss
proxy.queries:append(1, packet,{resultset_is_needed = true})return proxy.PROXY_SEND_QUERY
end
end
end
endfunction read_query_result(result_packet)
--- This only gets called if the proxy.queries queue is modified
cache_set(result_packet)
end
PS: Нямах намерение да пиша тази публикация, но я написах защото Благо беше казал, че ще му бъде интересно това решение. Ето Благо, специално за теб :P